如何在我的 COM 库中定义此结构

How can I define this struct in my COM library?

本文关键字:定义 结构 COM 我的      更新时间:2023-10-16

我在Visual Studio 2015中创建了一个新的ATL项目。我在库内添加了一个新的简单 ATL 对象,我正在尝试定义一个struct,以便我可以在我的 COM 实现中传递此struct。这是我CerberusNative.idl定义,添加了CerberusErrorDetails结构:

import "oaidl.idl";
import "ocidl.idl";
[
    object,
    uuid(B98A7D3F-651A-49BE-9744-2B1D8C896E9E),
    dual,
    nonextensible,
    pointer_default(unique)
]
interface ICerberusSession : IDispatch{
};
[
    uuid(8F2227F9-10A9-4114-A683-3CBEB02BD6DA),
    version(1.0),
]
library CerberusNativeLib
{
    [
        uuid(527568A1-36A8-467A-82F5-228F7C3AC926)
    ]
    typedef struct CerberusErrorDetails
    {
        INT ErrorCode;
        BSTR ErrorMessage;
    };
    importlib("stdole2.tlb");
    [
        uuid(CAB8A88E-CE0E-4B4C-B656-C52A7C8A5B18)      
    ]
    coclass CerberusSession
    {
        [default] interface ICerberusSession;
    };
};

当我尝试编译它时,出现以下错误:

错误MIDL2312非法语法,除非使用 mktyplib 兼容模式 : CerberusErrorDetails CerberusNative CerberusNative.idl 32

我做错了什么吗?这个mktyplib错误是什么?它为什么要要求它?

语法错误。正确方法:

    typedef
        [
            uuid(527568A1-36A8-467A-82F5-228F7C3AC926),
            version(1.0)
        ]
    struct CerberusErrorDetails {
        INT ErrorCode;
        BSTR ErrorMessage;
    } CerberusErrorDetails;

错误似乎是:

[
    uuid(527568A1-36A8-467A-82F5-228F7C3AC926)
]
typedef struct tagCerberusErrorDetails
{
    INT ErrorCode;
    BSTR ErrorMessage;
} CerberusErrorDetails; /// <- You forgot this

请注意,您似乎正在尝试的内容可能应该考虑使用ISupportErrorInfo/IErrorInfo这是报告错误号和消息的标准方式。

  • https://msdn.microsoft.com/en-us/library/windows/desktop/ms221062(v=vs.85(.aspx