通过COM从本机Visual C ++代码调用托管DLL中的函数

时间:2011-07-11 13:05:57

标签: windows visual-c++ dll com

提前道歉以下详细问题;我是COM菜鸟。

情景:我需要call a managed DLL built with C# from native Visual C++ code。在我的本机VC ++代码中,我在注册“SomeDLL.dll”并使用RegAsm.exe生成“SomeDLL.tlb”文件后执行以下操作。

  • 使用#import "SomeDLL.tlb"
  • 导入TLB文件
  • 使用DLL中定义的MyClassCComPtr<MyClass>

一切都很棒!它编译,我可以运行代码等。当我尝试在另一台机器上运行此应用程序时(即不是我编译它的那个),它会击中风扇。我复制了所有必需的DLL,并使用RegAsm.exe注册了相同的DLL,但它不起作用。

当它尝试使用CoInitialize(0)初始化COM库并返回S_FALSE错误时意外失败,这意味着

  

COM库已在此线程上初始化。

我可以自信地说我没有在我的代码中的任何其他位置调用此函数。

有什么建议吗?

2 个答案:

答案 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并不重要