You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 10:06:04