C++调用COM服务器CoCreateInstance报接口不支持但C#运行正常
问题核心原因
你原有C#代码调用CoGetClassObject获取的是类工厂对象的自定义接口,而你C++调用CoCreateInstance时,把类工厂的接口IID当做实例对象的接口IID传入,实例对象本身不实现这个类工厂接口,所以直接返回不支持的错误。
修复方案
方案1:对齐C#原逻辑,直接调用CoGetClassObject
和你C#代码逻辑完全一致,直接获取类工厂接口,代码参考:
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); if (FAILED(hr)) { // 处理COM初始化失败逻辑 } CLSID clsid; hr = CLSIDFromString(L"{1CA0D073-4ABB-4D06-B318-BFFDE38E4903}", &clsid); if (FAILED(hr)) { // 处理CLSID解析失败逻辑 } IID iidFactory; // 注意用IIDFromString解析接口ID,不要用CLSIDFromString hr = IIDFromString(L"{AE7CFA4B-985A-4F76-8CC6-2011649FC8A9}", &iidFactory); if (FAILED(hr)) { // 处理IID解析失败逻辑 } void* pFactory = nullptr; // 第二个参数CLSCTX_LOCAL_SERVER对应你C#代码里的数值4 hr = CoGetClassObject(clsid, CLSCTX_LOCAL_SERVER, NULL, iidFactory, &pFactory); if (FAILED(hr)) { _com_error err(hr); LPCTSTR errMsg = err.ErrorMessage(); MessageBox(NULL, errMsg, L"SiteKiosk demo", MB_ICONEXCLAMATION | MB_OK); CoUninitialize(); return false; } // 此处编写pFactory接口的使用逻辑 // 用完释放接口、清理COM环境 ((IUnknown*)pFactory)->Release(); CoUninitialize(); return true;
方案2:如果需要获取实例对象,替换正确的IID
如果你要调用的是实例对象的接口而非类工厂接口,从你拿到的tlb文件中找到目标实例的接口IID,替换CoCreateInstance的第四个参数即可。
额外优化建议
- 建议在工程中导入tlb文件,添加
#import "你的tlb文件路径.tlb" named_guids raw_interfaces_only指令,编译器会自动生成对应的CLSID、IID常量定义,无需手动解析字符串,避免GUID输入错误。 - 确认32位COM Server的注册表项正常,路径为
HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{1CA0D073-4ABB-4D06-B318-BFFDE38E4903},检查其下LocalServer32的路径指向正确的COM程序。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

