如何在C ++中使用属性声明COM接口

我正在尝试在eclipse C ++环境(MinGW GCC工具链)中调用已注册的COM接口(Inproc dll)。因此,我不相信我可以像在Visual C ++中那样简单地导入dll typelib。我正在尝试自己定义接口以简化函数调用,而不是使用Invoke。

oleview之外的接口IDL如下:

  uuid(9293C753-B073-11D2-BD89-0060978EEB9C),helpstring("IXSequence Interface"),dual
]
dispinterface IXSequence {
    properties:
    methods:
        [id(0x00000001),helpstring("method Close")]
        void Close();
        [id(0x00000002),helpstring("method New")]
        void New();
        [id(0x00000003),helpstring("method Open")]
        void Open(
                        BSTR FileName,long ReadOnly);
        [id(0x00000004),helpstring("method Save")]
        void Save(
                        BSTR username,BSTR Comment,long Overwrite);
        [id(0x00000005),helpstring("method SaveAs")]
        void SaveAs(
                        BSTR FileName,BSTR username,long Overwrite);
        [id(0x00000006),propget,helpstring("property Header")]
        VARIANT Header();
        [id(0x00000007),helpstring("property AuditDataCollection")]
        VARIANT AuditDataCollection();
        [id(0x00000008),helpstring("property Samples")]
        VARIANT Samples();
        [id(0x00000009),helpstring("property BracketType")]
        XBracketTypes BracketType();
        [id(0x00000009),propput,helpstring("property BracketType")]
        void BracketType([in] XBracketTypes rhs);
        [id(0x0000000a),helpstring("property UserLabel")]
        BSTR UserLabel(short Index);
        [id(0x0000000a),helpstring("property UserLabel")]
        void UserLabel(
                        short Index,[in] BSTR rhs);
        [id(0x0000000b),helpstring("property TrayConfiguration")]
        BSTR TrayConfiguration();
        [id(0x0000000b),helpstring("property TrayConfiguration")]
        void TrayConfiguration([in] BSTR rhs);
        [id(0x0000000c),helpstring("property FileName")]
        BSTR FileName();
        [id(0x0000000d),helpstring("property NewFile")]
        long NewFile();
};

我试图像这样在自己的头文件中定义接口:

const GUID CLSID_XcalFiles = { 0x9293C754,0xB073,0x11D2,{0xBD,0x89,0x00,0x60,0x97,0x8E,0xEB,0x9C } };
const IID IID_IXSequence = { 0x9293C753,0x9C } };

typedef enum {
    XUnspecified = 0,XOverlapped = 1,XNonBracketed = 2,XNonOverlapped = 3,XOpen = 4
} XBracketTypes;

enum XSampleTypes
{
    XSampleUnknown = 0,XSampleBlank = 1,XSampleQC = 2,XSampleStdClear = 3,XSampleStdUpdate = 4,XSampleStdBracket = 5,XSampleStdBracketStart = 6,XSampleStdBracketEnd = 7,XSampleProgram = 8,XSampleNumbersOfDifferentTypes = 9
};

DeclARE_INTERFACE_(IXSequence,IDispatch)
{
//methods
    STDMETHOD_(void,Close)(THIS)PURE;
    STDMETHOD_(void,New)(THIS)PURE;
    STDMETHOD_(void,Open)(THIS_ BSTR FileName,long ReadOnly)PURE;
    STDMETHOD_(void,Save)(THIS_ BSTR username,long Overwrite)PURE;
    STDMETHOD_(void,SaveAs)(THIS_ BSTR FileName,long Overwrite)PURE;
    STDMETHOD_(VARIANT,GetHeader)(THIS)PURE;
    STDMETHOD_(VARIANT,GetauditDataCollection)(THIS)PURE;
    STDMETHOD_(VARIANT,GetSamples)(THIS)PURE;
//properties
    STDMETHOD_(XBracketTypes,BracketType)(THIS)PURE;
    STDMETHOD_(void,BracketType)(THIS_ XBracketTypes rhs)PURE;
    STDMETHOD_(BSTR,UserLabel)(THIS_ short Index)PURE;
    STDMETHOD_(void,UserLabel)(THIS_ short Index,BSTR rhs)PURE;
    STDMETHOD_(BSTR,TrayConfiguration)(THIS)PURE;
    STDMETHOD_(void,TrayConfiguration)(THIS_ BSTR rhs)PURE;
    STDMETHOD_(BSTR,FileName)(THIS)PURE;
    STDMETHOD_(long,NewFile)(THIS)PURE;

};

这对于方法调用似乎很有效,但对属性而言效果不好。当我尝试调用任何属性函数时,都会遇到访问冲突。但是,如果我使用类似

的方法,它确实可以工作
STDMETHOD(GetBracketType)(THIS_ XBracketTypes* rhs)PURE;

这有意义吗?有没有更好的方法来声明COM接口的属性,以便可以像普通属性一样使用它们?

Jack2090 回答:如何在C ++中使用属性声明COM接口

通常,C ++接口类似于:

STDMETHOD(get_BracketType)(BracketType* BType);

STDMETHOD(put_BrackedType)(BracketType Btype);

属性通常将具有HRESULT返回类型...就像方法一样。它们将在属性名称前面带有get_或put_前缀。

不确定Eclipse C ++环境如何做到这一点。

本文链接:https://www.f2er.com/3156488.html

大家都在问