为以下详细问题提前道歉;我是COM菜鸟 .
Scenario: 我需要call a managed DLL built with C# from native Visual C++ code . 在我的本机VC代码中,我在注册"SomeDLL.dll"并使用 RegAsm.exe
生成"SomeDLL.tlb"文件后执行以下操作 .
-
使用
#import "SomeDLL.tlb"
导入TLB文件 -
使用DLL中定义的
MyClass
类CComPtr<MyClass>
.
一切都很棒!它编译,我可以运行代码等 . 当我尝试 run this application on a different machine (即不是我编译它的那个)时,它会击中风扇 . 我复制了所有必需的DLL,并使用 RegAsm.exe
注册了相同的DLL,但它不起作用 .
当它尝试使用 CoInitialize(0)
初始化COM库并返回 S_FALSE
错误时,它特别失败
COM库已在此线程上初始化 .
我可以自信地说我没有在我的代码中的任何其他地方调用此函数 .
有什么建议?
2 回答
很难帮助你从这里找到代码,你离我们更近了 . 也许是一个被注入的DLL .
获取S_FALSE不是错误,获取RPC_E_CHANGED_MODE会非常糟糕 . 一定要使用FAILED宏:
也许你在后台调用了OleInitialize或其他调用ComInitialize的函数 .
无论如何,如果你通过调用CoUninitialize来匹配每个线程,每个线程多次调用CoInitialize并不重要 .