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

How to declare COM interface with properties in C++

本文关键字:属性 声明 COM 接口 C++      更新时间:2023-10-16

我正试图在Eclipse C++环境(MinGW GCC工具链(中调用一个注册的COM接口(Inproc dll(。因此,我不相信我可以像在Visual C++中那样简单地导入dll类型库。我试图自己定义接口以简化函数调用,而不是使用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, 
BSTR Comment, 
long Overwrite);
[id(0x00000006), propget, helpstring("property Header")]
VARIANT Header();
[id(0x00000007), propget, helpstring("property AuditDataCollection")]
VARIANT AuditDataCollection();
[id(0x00000008), propget, helpstring("property Samples")]
VARIANT Samples();
[id(0x00000009), propget, helpstring("property BracketType")]
XBracketTypes BracketType();
[id(0x00000009), propput, helpstring("property BracketType")]
void BracketType([in] XBracketTypes rhs);
[id(0x0000000a), propget, helpstring("property UserLabel")]
BSTR UserLabel(short Index);
[id(0x0000000a), propput, helpstring("property UserLabel")]
void UserLabel(
short Index, 
[in] BSTR rhs);
[id(0x0000000b), propget, helpstring("property TrayConfiguration")]
BSTR TrayConfiguration();
[id(0x0000000b), propput, helpstring("property TrayConfiguration")]
void TrayConfiguration([in] BSTR rhs);
[id(0x0000000c), propget, helpstring("property FileName")]
BSTR FileName();
[id(0x0000000d), propget, 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, 0xB073, 0x11D2, {0xBD, 0x89, 0x00, 0x60, 0x97, 0x8E, 0xEB, 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, BSTR Comment, long Overwrite)PURE;
STDMETHOD_(void, SaveAs)(THIS_ BSTR FileName, BSTR UserName, BSTR Comment, 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接口的属性,这样我就可以像使用普通属性一样使用它们?

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

STDMETHOD(get_BracketType)(BracketType* BType);
STDMETHOD(put_BrackedType)(BracketType Btype);

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

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