【问题标题】:Calling a function in a managed DLL from native Visual C++ code through COM通过 COM 从本机 Visual C++ 代码调用托管 DLL 中的函数
【发布时间】:2011-10-02 19:01:15
【问题描述】:

为以下冗长的问题提前道歉;我是 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 库已在此线程上初始化。

我可以自信地说我没有在我的代码中的任何其他地方调用过这个函数。

有什么建议吗?

【问题讨论】:

    标签: windows visual-c++ dll com


    【解决方案1】:

    很难帮助您从这里找到该代码,您离这里更近了。可能是一个被注入的 DLL。

    获取 S_FALSE 不是错误,获取 RPC_E_CHANGED_MODE 会很糟糕。请务必使用 FAILED 宏:

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

    【讨论】:

    • 重新编译会完成什么?是的。
    • 好的,我使用的是FAILED宏,而不是检查hr == S_OK
    【解决方案2】:

    也许您调用了 OleInitialize 或其他在幕后调用 ComInitialize 的函数。

    无论如何,如果您将每个线程都与对 CoUninitialize 的调用相匹配,则每个线程多次调用 CoInitialize 并不重要

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 2011-06-13
      • 1970-01-01
      相关资源
      最近更新 更多