我有 C# COM 服务器和 C++ com 客户端。我正在 Windows 2008 R2 上进行测试并在 Windows 7 上进行开发。
我有一个用于记录的回调接口声明如下
public interface ILoggerCallback
{
void critical(ref string message);
void debug(ref string message);
void error(ref string message);
void infohigh(ref string message);
void infolow(ref string message);
void warning(ref string message);
}/**/
C++ COM 客户端实现接口(类 log_cb),现在将所有内容打印到控制台。
HRESULT __stdcall log_cb::raw_infohigh(BSTR* message )
{
wprintf(L"\nwarning: %s", *message);
return S_OK;
}
我在 COM 客户端中创建了一个工作线程,使用 boost 线程来进行 COM 初始化、实例创建等。当在 c#com 服务器中进行以下回调时
log.infohigh("Successfully initialised server");
我注意到日志回调在 Windows 2008 R2 测试机器上因此异常而失败,但在 win7 开发机器上工作正常
C:\TEMP\COMServerTest>SampleCOMClient.exe
Successfully created instance
Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at System.StubHelpers.InterfaceMarshaler.ConvertToManaged(IntPtr pUnk, IntPtr itfMT, IntPtr classMT, Int32 flags)
我用 Windows 线程尝试了这个,它工作正常。仅仅包括
#include "boost/thread.hpp"
导致此错误。
谁能解释一下这里发生了什么。非常感谢。