VB编写的COM客户端应用迁移至C++出现E0070错误如何解决
错误根因
#import指令中使用了raw_interfaces_only参数,该参数会仅生成原始COM接口定义,不会生成C++侧的COM类包装、智能指针辅助类,导致Person类型无完整定义- COM组件对象不能像普通C++栈变量直接声明实例化,必须通过COM运行时的实例化接口创建
- COM接口的属性访问需使用
put_/get_前缀的方法,字符串参数要求为BSTR类型,不可直接传入C风格字符串 - C++字符串中路径反斜杠需要转义,需写为
\\
正确实现代码
// 去掉raw_interfaces_only参数,否则不会生成智能指针包装 #import "COM.tlb" raw_native_types, no_namespace, named_guids #include <iostream> #include <comdef.h> // 用于_bstr_t类型转换 int main() { // 初始化COM运行环境 HRESULT hr = CoInitialize(NULL); if (FAILED(hr)) { std::cout << "COM初始化失败,错误码:" << hr << std::endl; return -1; } try { // 用智能指针实例化Person COM对象 IPersonPtr pPerson(__uuidof(Person)); // 设置属性,用_bstr_t转换C字符串为COM要求的BSTR类型 pPerson->put_FirstName(_bstr_t("Maxim")); pPerson->put_LastName(_bstr_t("Donax")); // 调用Persist方法,注意路径反斜杠转义 pPerson->Persist(_bstr_t("C:\\myFile.xml")); std::cout << "执行成功" << std::endl; } catch (_com_error& e) { std::cout << "调用出错:" << e.ErrorMessage() << std::endl; } // 卸载COM运行环境 CoUninitialize(); return 0; }
补充说明
- 如果坚持使用raw接口模式操作,需要手动调用
CoCreateInstance创建接口实例,手动管理BSTR内存、手动检查HRESULT返回值,开发复杂度更高 - 编译时需要确保COM.tlb文件在项目包含路径中,运行时需要确保对应的COM组件已经正确注册到系统
内容的提问来源于stack exchange,提问作者Donax
相关产品推荐
相关产品推荐

