我正在编写一个Win32 C ++ DLL,它使用在C#中创建的COM对象(B.dll)。 这个dll(A.dll)提供了CMyComObject类,它创建一个COM对象并访问它。 这是我的代码。
void CMyComObject::CMyComObject()
{
HRESULT result = CoInitialize(NULL);
...
result = CoCreateInstance(CLSID_COMDLL, NULL, CLSCTX_INPROC_SERVER, IID_COMDLL, reinterpret_cast<void**>(&MyComObject));
}
void CMyComObject::~CMyComObject()
{
..
CoUninitialize();
..
}
然后,这是一个加载A.dll并访问COM对象的客户端程序。 该程序创建了几个加载A.dll并同时创建COM对象的线程。
在这种情况下,使用CoInitialize()函数是正确的还是我应该将COInitializeEx()函数与COINIT_MULTITHREADED参数一起使用? 或者我做错了吗? (我通过命令“reg_asm.exe B.dll B.tlb / codebase”注册了B.dll)
抱歉我的英语不好。
感谢。
答案 0 :(得分:1)
您应该在该线程上的任何COM活动之前和之后使用CoInitialize[Ex]
/ CoUninitialize
,并且您在具有特定参数的CoInitialize
和CoInitializeEx
之间的选择取决于是否您更喜欢线程的STA或MTA模式。
话虽如此,你的初始化:
再次总结一下,你的初始化:
CoInitialize
和CoUninitialize
调用移出构造函数并将其与线程代码相关联CoUninitialize
之前关闭所有COM活动,包括释放MyComObject
指针。