调用 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# 正常工作的主要内容,如果未能解决你的问题,请参考以下文章