提前道歉以下详细问题;我是COM菜鸟。
情景:我需要call a managed DLL built with C# from native Visual C++ code。在我的本机VC ++代码中,我在注册“SomeDLL.dll”并使用RegAsm.exe
生成“SomeDLL.tlb”文件后执行以下操作。
#import "SomeDLL.tlb"
MyClass
类CComPtr<MyClass>
。一切都很棒!它编译,我可以运行代码等。当我尝试在另一台机器上运行此应用程序时(即不是我编译它的那个),它会击中风扇。我复制了所有必需的DLL,并使用RegAsm.exe
注册了相同的DLL,但它不起作用。
当它尝试使用CoInitialize(0)
初始化COM库并返回S_FALSE
错误时意外失败,这意味着
COM库已在此线程上初始化。
我可以自信地说我没有在我的代码中的任何其他位置调用此函数。
有什么建议吗?
答案 0 :(得分:1)
很难帮助你从这里找到代码,你离得更近了。也许是一个被注入的DLL。
获取S_FALSE是不错误,获取RPC_E_CHANGED_MODE会非常糟糕。请务必使用FAILED宏:
HRESULT hr = CoInitialize(0);
if (FAILED(hr)) {
CallNineOneOne(hr);
exit(hr);
}
答案 1 :(得分:0)
也许您调用了OleInitialize或其他在幕后调用ComInitialize的函数。
无论如何,如果你通过调用CoUninitialize来匹配每个线程,那么每个线程多次调用CoInitialize并不重要