我正在尝试在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接口的属性,以便可以像普通属性一样使用它们?