【问题标题】:C# COM object and CreateDispatchC# COM 对象和 CreateDispatch
【发布时间】:2014-09-01 05:35:58
【问题描述】:

首先:有使用 CreateDispatch 的现有代码。出于兼容性/方便的原因,维护者不想更改代码(使用新的 TLB/GUID 除外)。

所以我必须创建符合此限制的 COM 对象。最好在 C# 中使用(但 C++ 也可以)。

问题是:我完全没有使用 COM 的经验。

这就是我得到的结果:我在 C# 中创建了一个 COM 对象,注册它并获得了一个 tlb。我检查了注册表,有一个条目:HKEY_CLASSES_ROOT\Wow6432Node\CLSID{36E6BC94-308C-4952-84E6-109041990EF7}

看起来不错。下一步:创建一个测试程序(C++)。我创建了一个启用了 MFC 的 C++ 控制台项目,导入了 tlb。然后我在 main 中添加了以下几行:

CInterface01 server;
COleException* pe = new COleException;
LPTSTR m = new TCHAR[255];

CoInitialize(NULL);

server.CreateDispatch(L"{36E6BC94-308C-4952-84E6-109041990EF7}", pe);
pe->GetErrorMessage(m, 255);

不知何故 CreateDispatch 不起作用。在异常中显示:“类未注册”(什么?!它在注册表中)。更糟糕的是:当我再次运行相同的程序时,它会使 Visual Studio 崩溃。

感觉解决方案就在附近,但我不知道出了什么问题。

【问题讨论】:

  • CreateDispatch() 有两个重载。一个是 CLSID,您将使用 CLSIDFromString() 辅助函数来转换您使用的字符串。另一个接受一个字符串,一个 ProgId。你会使用(比如说)“ClassLibrary1.Class1”。
  • CLSIDFromProgID(L"ComServer2.CSCOMClass01", &id);返回一个NULL类,CLSIDFromString(L"{36E6BC94-308C-4952-84E6-109041990EF7}", &id);返回id = {CLSID_ComServer2.CSCOMClass01},但是结果是一样的
  • 如果没有任何关于如何注册 .NET 程序集的信息,您将不得不搜索“类未注册”。这 1.58 亿次点击可以解释您的问题。

标签: c# c++ com mfc


【解决方案1】:

你需要这样的代码:

//接口包装方法实现 #import "YouTlbModule.tlb" no_namespace //功能 CoInitializeEx (NULL, COINIT_MULTITHREADED); IYouTlbModulePtr ptrYouTlbModule; HRESULT hResult = ptrYouTlbModule.CreateInstance(OLESTR("Your.Component.Name")); //测试hResult //其他函数调用 hResult = ptrYouTlbModule.Other(122, L"AAA"); //称呼 int ret = ptrYouTlbInput.GetErrorMessage(m, 255);

【讨论】:

    猜你喜欢
    • 2012-12-15
    • 2014-12-27
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 2010-12-02
    • 2014-03-05
    • 2012-10-02
    相关资源
    最近更新 更多