【问题标题】:Creating COM interface pointer works on development machine but causes application crash on other machine创建 COM 接口指针在开发机器上工作,但在其他机器上导致应用程序崩溃
【发布时间】:2017-10-07 19:36:02
【问题描述】:

我正在使用 COM 互操作从 C++ 应用程序调用 C# dll 中的方法。

C#代码是:

namespace MyLibrary
{
  [ComVisible(true)]
  [Guid("f08942b1-db20-44aa-9713-7d28fff51e2b")]
  public interface IMyLibraryInterface
  {
    string POSRequest(string request);
  }

  [ComVisible(true)]
  [Guid("4d962dd5-05ed-431b-82e2-378aebe8d0dc")]
  public class MyLibraryInterface : IMyLibraryInterface
  {
    public string myRequest(string request)
    {
      ....
      return response;
    }
  }
}

调用C++代码是:

CoInitialize(NULL);
MyLibrary::IMyLibraryInterfacePtr MyLibraryInterface(__uuidof(MyLibrary::MyLibraryInterface));
myResult = (LPCTSTR) MyLibraryInterface->myRequest(myInput);
CoUninitialize();

相关 tlb 文件的导入位置:

#import "MyLibrary.tlb"

这在我的开发机器上调试和运行发布版本时都有效,但是当我从另一台机器上运行它时会导致应用程序崩溃。具体来说,创建指针的行似乎是问题所在:

MyLibrary::IMyLibraryInterfacePtr MyLibraryInterface(__uuidof(MyLibrary::MyLibraryInterface));

似乎另一台机器上可能缺少某些东西,但我不知道是什么?

【问题讨论】:

  • 你在另一台机器上注册了 C# COM dll 吗?您必须使用regasm.exe 来注册dll。
  • 您必须注册 COM 才能使用它,这也是尽可能避免使用它的一个很好的理由 :)。
  • 如果您不想先注册 COM,可以使用 免注册 COM 模型进行 xcopy 部署。 msdn.microsoft.com/en-us/library/ms973913.aspx
  • @MickyD - 这是一个好点,我忘记了这一点,我在一些部署中使用了无注册 COM。我很高兴我已经好几年没和 COM 打交道了。
  • @tj_ush - 如果您将不得不使用使用 COM 的遗留代码库,请尝试查找 Don Box's "Essential COM" 的副本。当我开始进行 COM 编程时,我发现它非常有用。

标签: c# c++ visual-studio mfc com


【解决方案1】:

使用暴露 COM 接口的 dll 时,需要注册该 dll。注册 C# COM dll 的工具是 regasm.exe。作为安装过程的一部分,您需要在任何公开 COM 接口的 dll 上调用 regasm。作为调试和帮助自己的一部分,您可以稍微修改代码以便能够在尝试创建对象时检查 HRESULT,并在需要时记录。
注意:我没有有测试此代码的设置,因此它们可能是一个错字,但它应该为您指明正确的方向。如果您没有 VS 创建的“智能指针”,您可以使用 CoCreateInstance 调用来创建您的对象,然后从该调用中检查 HRESULT。

IMyLibraryInterfacePtr myIntPtr = null;
HRESULT hRes = myIntPtr.CreateInstance(__uuidof(MyLibrary::MyLibr‌aryInterface));
if (!(SUCCEEDED(hRes))
{
    // This means an error occurred, you can log it for debugging, etc.
}

编辑 根据 MickyD 的评论,为了完成,有一种方法可以在没有registering dll 的情况下使用 COM。它涉及创建与应用程序一起存在的清单文件。

【讨论】:

  • 不错。也谢谢你的插件:)
  • @MickyD - 信用到期!你激发了我的记忆。我已经忘记了 regfree COM 的东西,现在我回忆起花了几个小时翻阅 Don Box 的书“Essential COM”……虽然不确定那些是快乐的回忆。注意:这不是对这本书的抨击,那本书在帮助我理解 COM 方面非常出色,只是不确定与 COM 一起工作是否是一段愉快的回忆。
  • 谢谢您的好先生。我有大量来自 Wrox Press 的 COM 和 DCOM(救救我!)书籍……那些红色的大书。是的,现在有更简单的方法来做事:)
  • 如果你的设置是 InnoSetup 那么注册你的程序集就很容易了。
猜你喜欢
  • 1970-01-01
  • 2012-12-13
  • 2015-10-04
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
相关资源
最近更新 更多