COM编程之IDispatch

IDispatch是由OLE自动化协议暴露出来的接口。它是COM对象可以暴露出来的标准接口(Interface)之一(IDispatch最前面的“I”代表Interface)。COM可以由三种接口类型予以区分,它们是自定义接口(custom),调度接口(dispatch)和双重接口(dual interfaces)。

IDispatch可以由IUnknown得到,并且在IUnknown本身所含有三个方法(AddRefReleaseQueryInterface)上增加另外四个方法(GetTypeInfoCountGetTypeInfoGetIDsOfNamesInvoke)。

自动化接口IDispatch允许客户端程序探明一个运行中的对象到底支持什么属性和方法。


结构声明

C语言风格

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

typedefstruct IDispatchVtbl

{

   BEGIN_INTERFACE

    

   HRESULT( STDMETHODCALLTYPE *QueryInterface )( 

        IDispatch * This,

        REFIID riid,

        void**ppvObject);

    

   ULONG( STDMETHODCALLTYPE *AddRef )( 

        IDispatch * This);

    

   ULONG( STDMETHODCALLTYPE *Release )( 

        IDispatch * This);

    

   HRESULT( STDMETHODCALLTYPE *GetTypeInfoCount )( 

        IDispatch * This,

        UINT*pctinfo);

    

   HRESULT( STDMETHODCALLTYPE *GetTypeInfo )( 

        IDispatch * This,

        UINTiTInfo,

        LCIDlcid,

        ITypeInfo **ppTInfo);

    

   HRESULT( STDMETHODCALLTYPE *GetIDsOfNames )( 

        IDispatch * This,

        REFIID riid,

        LPOLESTR *rgszNames,

        UINTcNames,

        LCIDlcid,

        DISPID *rgDispId);

    

   HRESULT( STDMETHODCALLTYPE *Invoke )( 

        IDispatch * This,

        DISPID dispIdMember,

        REFIID riid,

        LCIDlcid,

        WORDwFlags,

        DISPPARAMS *pDispParams,

        VARIANT *pVarResult,

        EXCEPINFO *pExcepInfo,

        UINT*puArgErr);

    

   END_INTERFACE

} IDispatchVtbl;

 

interface IDispatch

{

   CONST_VTBLstructIDispatchVtbl *lpVtbl;

};


C++语言风格

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

IDispatch : publicIUnknown

{

public:

   virtualHRESULT STDMETHODCALLTYPE GetTypeInfoCount( 

        UINT*pctinfo) = 0;

    

   virtualHRESULT STDMETHODCALLTYPE GetTypeInfo( 

        UINTiTInfo,

        LCIDlcid,

        ITypeInfo **ppTInfo) = 0;

    

   virtualHRESULT STDMETHODCALLTYPE GetIDsOfNames( 

        REFIID riid,

        LPOLESTR *rgszNames,

        UINTcNames,

        LCIDlcid,

        DISPID *rgDispId) = 0;

    

   virtualHRESULT STDMETHODCALLTYPE Invoke( 

        DISPID dispIdMember,

        REFIID riid,

        LCIDlcid,

        WORDwFlags,

        DISPPARAMS *pDispParams,

        VARIANT *pVarResult,

        EXCEPINFO *pExcepInfo,

        UINT*puArgErr) = 0;

    

};


方法说明

IDispatch除开由IUnknown继承来的三个方法以外的余下四个方法:[2]

方法

描述

GetIDsOfNames

将单一的数字或一组可选的参数映射到一组对应的整形DISPID上,这些DISPID随后可以用来调用Invoke

GetTypeInfo

得到对象的类型信息,从而可以通过它来得到接口的类型信息。

GetTypeInfoCount

得到对象所提供的类型信息接口的数目(01)。

Invoke

提供对对象暴露出来的属性和方法的访问。


所需条件

头文件

oaidl.h, oaidl.idl

库文件

oleaut32.lib, uuid.lib

Windows Embedded CE

Windows CE 2.0 and later

Windows Mobile

Windows Mobile Version 5.0 and later


你可能感兴趣的:(C++,IDispatch)