首页 文章

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

提问于
浏览
0

为以下详细问题提前道歉;我是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中定义的 MyClassCComPtr<MyClass> .

一切都很棒!它编译,我可以运行代码等 . 当我尝试 run this application on a different machine (即不是我编译它的那个)时,它会击中风扇 . 我复制了所有必需的DLL,并使用 RegAsm.exe 注册了相同的DLL,但它不起作用 .

当它尝试使用 CoInitialize(0) 初始化COM库并返回 S_FALSE 错误时,它特别失败

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

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

有什么建议?

2 回答

  • 1

    很难帮助你从这里找到代码,你离我们更近了 . 也许是一个被注入的DLL .

    获取S_FALSE不是错误,获取RPC_E_CHANGED_MODE会非常糟糕 . 一定要使用FAILED宏:

    HRESULT hr = CoInitialize(0);
    if (FAILED(hr)) {
        CallNineOneOne(hr);
        exit(hr);
    }
    
  • 0

    也许你在后台调用了OleInitialize或其他调用ComInitialize的函数 .

    无论如何,如果你通过调用CoUninitialize来匹配每个线程,每个线程多次调用CoInitialize并不重要 .

相关问题