调用 COM 服务器,C++ CoCreateInstance 抛出“不支持此类接口”,C# 正常工作

Posted

技术标签:

【中文标题】调用 COM 服务器,C++ CoCreateInstance 抛出“不支持此类接口”,C# 正常工作【英文标题】:Calling COM server, C++ CoCreateInstance throws "No such interface supported", C# works without issue 【发布时间】:2021-11-25 20:22:09 【问题描述】:

我正在尝试重写一些将本地 COM 服务器从 C# 调用到 C++ 的代码。 C# 代码可以正常工作。关键部分是:

Guid lr_FactoryGuid = Guid.Parse("AE7CFA4B-985A-4F76-8CC6-2011649FC8A9");
Guid lr_FactoryClass = Guid.Parse("1CA0D073-4ABB-4D06-B318-BFFDE38E4903");

IntPtr lk_FactoryPtr = new IntPtr();
CoGetClassObject(
    ref lr_FactoryClass, 
    4, 
    new IntPtr(), 
    ref lr_FactoryGuid, 
    out lk_FactoryPtr);

if (lk_FactoryPtr == IntPtr.Zero)

    MessageBox.Show("lk_FactoryPtr  == IntPtr.Zero");
    return false;

我尝试将其重写为 C++,但我无法比这里更进一步,错误是“不支持此类接口”:

HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

CLSID clsid;
HRESULT hr = CLSIDFromString(L"1CA0D073-4ABB-4D06-B318-BFFDE38E4903", &clsid);

CLSID iid;
hr = CLSIDFromString(L"AE7CFA4B-985A-4F76-8CC6-2011649FC8A9", &iid);

void* pIFace;
hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, iid, &pIFace);

if (!SUCCEEDED(hr))

    _com_error err(hr);
    LPCTSTR errMsg = err.ErrorMessage();
    
    MessageBox(NULL, errMsg, L"SiteKiosk demo", MB_ICONEXCLAMATION | MB_OK);

有一个 .tlb 文件,我用它来为 C# 生成互操作 DLL 并导入到 C++ 中,但它目前已从 C++ 中注释掉以试图使代码更小,我仍然从 CoCreateInstance 收到此错误.

我调用的 COM 应用程序是 32 位应用程序,因此我的 C# 和 C++ 客户端应用程序也是 32 位的。两个客户端都是 Windows 控制台应用程序。

我还需要设置/做些什么来让 C++ 正常工作吗?

【问题讨论】:

CoGetClassObject() 的使用非常不寻常,通常你会要求 IID_IClassFactory。 CoCreateInstance() 无能为力,因此您同样必须在 C++ 代码中使用 CoGetClassObject()。 Hans 的建议解决了这个问题,我使用 CoGetClassObject 和其余代码然后点击到位。 然后回答自己,这样问题就结束了 【参考方案1】:

Hans 的建议解决了这个问题,我使用 CoGetClassObject 和其余代码然后点击到位。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于调用 COM 服务器,C++ CoCreateInstance 抛出“不支持此类接口”,C# 正常工作的主要内容,如果未能解决你的问题,请参考以下文章

CoCreateInstance 异常。在静态库上使用 REGSVR32 进行类注册?

无法从 C++ 调用 .Net 服务

COM C#, 如何使用 C++ 调用 COM

从 C++ 调用 C# com 对象,谁应该释放内存?

C++调用COM之错

VC6.0和VS2005:C++和C#编写调用COM组件