mogo 发表于 2026-1-17 10:40:45

【求助】COM封装翻译

一开始只是想封装Illustrator的。然后看到了COM对象有个查看接口的方法,就做了个从接口窗口复制COM代码再翻译到中文的功能。但每次复制粘贴太麻烦了,逛论坛时才知道工具菜单下有个COM封装器,所以又做成翻译火山代码。发现使用 寻找文本 竟然找不到"<"(207行),于是就想着自己解释COM接口。所以代码有些乱。

请教各位大佬以下代码是结构(876行)声明有问题,还是双星指针的代码(1020行)有问题呢?
<火山程序 类型 = "通常" 版本 = 1 />

类 TLIBATTR结构体2 <基础类 = 结构基础类 折叠>
{

    # @ @m<DECLARE_STRUCT_CLASS> (TLIBATTR)

    方法 类型标识 <公开 属性读 类型 = GUID类>
    {
      变量 GUID <类型 = GUID类>
      @ @<GUID>.m_guid = pdata()->guid;
      返回 (GUID)
    }

    方法 硬件平台 <公开 属性读 类型 = 变整数 注释 = "SYSKIND syskind; 目标硬件平台。" @嵌入式方法 = "">
    {
      @ (INT_P)(@sn<this>.pdata()->syskind)
    }

    方法 主版本号 <公开 属性读 类型 = 短整数 注释 = "WORD wMajorVerNum; 主版本号" @嵌入式方法 = "">
    {
      @ @sn<this>.pdata()->wMajorVerNum
    }

    方法 次版本号 <公开 属性读 类型 = 短整数 注释 = "WORD wMinorVerNum; 次版本号" @嵌入式方法 = "">
    {
      @ @sn<this>.pdata()->wMinorVerNum
    }

    #
}

类 TLIBATTR结构体 <注释 = "https://learn.microsoft.com/zh-cn/windows/win32/api/oaidl/ns-oaidl-tlibattr" 折叠
      折叠2 @别名 = "TLIBATTR" @别名类型 = 本地类 @视窗.结构类 = 0>
{
    变量 类型标识 <公开 类型 = "字节 " 注释 = "GUID    guid;         类型信息的 GUID" @输出名 = "guid">
    变量 区域标识 <公开 类型 = 短整数 注释 = "LCID    lcid;         成员名称和文档字符串的区域设置" @输出名 = "lcid">
    变量 硬件平台 <公开 类型 = 变整数 注释 = "SYSKIND syskind;      目标硬件平台。" @输出名 = "syskind">
    变量 主版本号 <公开 类型 = 短整数 注释 = "WORD    wMajorVerNum; 主版本号。" @输出名 = "wMajorVerNum">
    变量 次版本号 <公开 类型 = 短整数 注释 = "WORD    wMinorVerNum; 次版本号。" @输出名 = "wMinorVerNum">
    变量 库标志 <公开 类型 = 短整数 注释 = "WORD    wLibFlags;    库标志。" @输出名 = "wLibFlags">
}

<火山程序 类型 = "通常" 版本 = 1 />

方法 获取库属性 <公开 类型 = 逻辑型
      注释 = "https://learn.microsoft.com/zh-cn/windows/win32/api/oaidl/nf-oaidl-itypelib-getlibattr"
      返回值注释 = "成功返回假,失败返回真" 折叠>
参数 TLIBATTR结构 <类型 = TLIBATTR结构体>
{
    变量 结构地址 <类型 = 变整数>
    结构地址 = 取变量地址 (TLIBATTR结构)
    调试输出 (当前时间 (), 取源行号 (), 取源类名 (), 取源方法名 (), 结构地址)
    @ hresult = iTypeLib->GetLibAttr((TLIBATTR**)&@<结构地址>);
    返回 (执行失败)
}

方法 释放库属性 <公开
      注释 = "https://learn.microsoft.com/zh-cn/windows/win32/api/oaidl/nf-oaidl-itypelib-releasetlibattr">
参数 TLIBATTR结构 <类型 = TLIBATTR结构体>
{
    变量 结构地址 <类型 = 变整数>
    结构地址 = 取变量地址 (TLIBATTR结构)
    调试输出 (当前时间 (), 取源行号 (), 取源类名 (), 取源方法名 (), 结构地址)
    @ iTypeLib->ReleaseTLibAttr((TLIBATTR*)&@<TLIBATTR结构>);

}
运行后报以下错误:
错误: 接收到未经处理的严重异常,代码为: 0xC0000374
被调试程序已经退出,退出码为0xC0000374.
另外请教要如何自定义调试数据格式呢?尝试了以下都不成功(405行),或者 取当前语句位置() 中的文件名改为无路径文件名也可以。
<火山程序 类型 = "通常" 版本 = 1 />

方法 调试信息 <公开 静态 类型 = 文本型 注释 = "行号 类名 方法" @嵌入式方法 = "">
{
    @_CT(@sn<current_source_line>) + @sn<nbsp> + _CT(@sn<current_source_class>) + _CT(@sn<current_source_method>)
}

方法 "//调试" <公开 静态 @嵌入式方法 = "">
参数 被调试数据 <@匹配类型 = 通用型 @可扩展 = "">
{
    // 调试输出 (当前时间 (), 取源行号 (), 取源类名 (), 取源方法名 (),被调试数据)
    @ _DEBUG_STATMENT (DebugTrace (FALSE, 0, 0, _T (@sn<pm_types>),@<当前时间>(),_CT (@sn<current_source_line>),_CT (@sn<current_source_class>),_CT (@sn<current_source_method>), @<被调试数据>))
    // 取源行号() = @ _CT (@sn<current_source_line>)
    // 取源类名() = @ _CT (@sn<current_source_class>)
    // 取源方法名() = @ _CT (@sn<current_source_method>)

}

页: [1]
查看完整版本: 【求助】COM封装翻译