class COleDispatchDriver
{
// Constructors
public:
COleDispatchDriver();
COleDispatchDriver(LPDISPATCH lpDispatch, BOOL bAutoRelease = TRUE);
COleDispatchDriver(const COleDispatchDriver& dispatchSrc);
// Attributes
LPDISPATCH m_lpDispatch;
BOOL m_bAutoRelease;
// Operations
BOOL CreateDispatch(REFCLSID clsid, COleException* pError = NULL);
BOOL CreateDispatch(LPCTSTR lpszProgID, COleException* pError = NULL);
void AttachDispatch(LPDISPATCH lpDispatch, BOOL bAutoRelease = TRUE);
LPDISPATCH DetachDispatch();
// detach and get ownership of m_lpDispatch
void ReleaseDispatch();
// helpers for IDispatch::Invoke
void AFX_CDECL InvokeHelper(DISPID dwDispID, WORD wFlags,
VARTYPE vtRet, void* pvRet, const BYTE* pbParamInfo, ...);
void AFX_CDECL SetProperty(DISPID dwDispID, VARTYPE vtProp, ...);
void GetProperty(DISPID dwDispID, VARTYPE vtProp, void* pvProp) const;
// special operators
operator LPDISPATCH();
const COleDispatchDriver& operator=(const COleDispatchDriver& dispatchSrc);
// Implementation
public:
~COleDispatchDriver();
void InvokeHelperV(DISPID dwDispID, WORD wFlags, VARTYPE vtRet,
void* pvRet, const BYTE* pbParamInfo, va_list argList);
};
COleDispatchDriver类实现OLE自动化中的客户方。OLE调度接口为访问一个对象的方法和属性提供了途径。COleDispatchDriver的成员函数连接,分离,创建和释放一个IDispatch类型的调度连接。其它的成员函数使用变量参数列表来简化调用IDispatch::Invoke。
这个类可以直接使用,但一般来说,它只是由用ClassWizard创建的类使用。
当你通过引用一个类型库来创建一个新的C++类时,ClassWizard从COleDispatchDriver派生出新类。
有关使用COleDispatchDriver的更多信息,参见下面列出的“Visual C++程序员指南”一书中的文章:
· | 自动化客户 |
· | 自动化服务器 |
· | ClassWizard自动化支持 |
COleDispatchDriver成员函数
数据成员
m_bAutoRelease | 在执行ReleaseDispatch或析构对象时,指定是否要释放Idispatch |
m_lpDispatch | 表示指向附着在这个COleDispatchDriver的IDispatch接口的指针 |
构造
COleDispatchDriver | 构造一个COleDispatchDriver对象 |
操作
CreateDispatch | 创建一个IDispatch连接并将它附着于COleDispatchDriver对象 |
AttachDispatch | 将一个IDispatch连接附着于COleDispatchDriver对象 |
DetachDispatch | 分开一个IDispatch连接,但并不释放它 |
ReleaseDispatch | 释放一个IDispatch连接 |
InvokeHelper | 用于调用自动化方法的助手 |
SetProperty | 设置一个自动化特性 |
GetProperty | 获得一个自动化特性 |
COleDispatchDriver::AttachDispatch
void AttachDispatch( LPDISPATCH lpDispatch, BOOL bAutoRelease = TRUE);
参数:
lpDispatch | 被附着于COleDispatchDriver对象的指向一个OLE IDispatch对象的指针。 |
bAutoRelease | 表明当对象超出范围时,是否要释放dispatch。 |
说明:
调用AttachDispatch成员函数可以将一个IDispatch指针附着于COleDispatchDriver对象上。这个函数释放任何已经附着于COleDispatchDriver对象的IDispatch指针。
COleDispatchDriver::COleDispatchDriver
COleDispatchDriver();
COleDispatchDriver(LPDISPATCH lpDispatch,BOOL bAutoRelease = TRUE);
COleDispatchDriver(const COleDispatchDriver& dispatchSrc);
参数:
lpDispatch | 指向一个被附着于COleDispatchDriver对象的OLE IDispatch对象的指针。 |
bAboutRelease | 当对象超出范围时,表明是否要释放这个dispatch。 |
dispatchSrc | 对一个已存在的COleDispatchDriver对象的引用。 |
说明:
构造一个COleDispatchDriver对象。
COleDispatchDriver(LPDISPATCH lpDispatch,BOOL bAutoRelease = TRUE)连接IDispatch接口。
COleDispatchDriver(const COleDispatchDriver& dispatchSrc)拷贝一个已存在的COleDispatchDriver对象,并增加引用计数。
COleDispatchDriver( )创建一个COleDispatchDriver对象,但不连接IDispatch接口。在使用一个没有参数的COleDispatchDriver( )之前,应该用COleDispatchDriver::CreateDispatch或者COleDispatchDriver::AttachDispatch为它连接一个IDispatch。
COleDispatchDriver::CreateDispatch
BOOL CreateDispatch(REFCLSID clsid, COleException* pError = NULL);
BOOL CreateDispatch(LPCTSTR lpszProgID, COleException* pError = NULL);
返回值:成功则返回非零值;否则返回0。
参数:
clsid | 要创建的IDispatch连接对象的类ID。 |
pError | 指向一个OLE异常对象的指针,这个异常对象将保存在创建中产生的状态码。 |
lpszProgID | 指向一个自动化对象的标识符的指针,如“Excel.Document.5”。将要创建的调度对象是为这个自动化对象创建的。 |
说明:
创建一个IDispatch对象并将它与COleDispatchDriver对象连接。
COleDispatchDriver::DetachDispatch
LPDISPATCH DetachDispatch();
返回值:
一个指向以前连接的IDispatch对象的指针。
说明:
将当前的IDispatch连接从对象上分离。但不释放这个IDispatch。
COleDispatchDriver::GetProperty
void GetProperty(DISPID dwDispID,VARTYPE vtProp,void* pvProp) const;
参数:
dwDispID | 标识需要获得的属性。这个值通常由ClassWizard提供。 |
vtProp | 指定要获取的属性。可能的取值可以参见COleDispatchDriver::InvokeHelper的说明部分。 |
pvProp | 用来接收属性值的变量的地址。它必须与vtProp所指定的类型相匹配。 |
说明:获取由dwDispID指定的对象属性。
COleDispatchDriver::InvokeHelper
void InvokeHelper(DISPID dwDispID, WORD wFlags, VARTYPE vtRet, void* pvRet, const BYTE FAR* pbParamInfo, ...);
参数:
dwDispID | 标识要激活的方法或者属性。这个值常常由ClassWizard提供。 |
wFlag | 描述调用IDispatch::Invoke的前后关系的标志。其可能的取值参见Platform SDK。 |
vtRet | 指定返回值的类型。其可能的取值参见说明部分。 |
pvRet | 是将用来接收属性值或返回值的变量的地址。它必须与vtRet所指定的类型相匹配。 |
pbParamInfo | 是一个指向用空字符结尾的字符串的指针,这个字符串有多个字节用来指定紧跟pbParamInfo之后的参数的类型。 |
... | 参数变量列表,这些参数的类型在pbParamInfo中指定。 |
说明:
在由wFlags指定的前后关系中调用由dwDispID指定的方法或属性。参数pbParamInfo指定要传递给方法或属性的参数的类型。在语法说明中“...”所代表的就是参数的变量列表。
vtRet参数可能的取值来自于VARENUM枚举。
可能的取值如下所示:
符号 | 返回类型 |
VT_EMPTY | void |
VT_I2 | short |
VT_I4 | long |
VT_R4 | float |
VT_R8 | double |
VT_CY | CY |
VT_DATE | DATE |
VT_BSTR | BSTR |
VT_DISPATCH | LPDISPATCH |
VT_ERROR | SCODE |
VT_BOOL | BOOL |
VT_VARIANT | VARIANT |
VT_UNKNOWN | LPUNKNOWN |
此函数将参数转换为VARIANTARG值,然后激活IDispatch::Invoke方法。如果对Invoke的调用失败,这个函数将抛出一个异常。如果由IDispatch::Invoke返回的SCODE(状态码)是DISP_E_EXCEPTION,此函数抛出一个COleException对象;否则它抛出一个COleDispatchException。
COleDispatchDriver::ReleaseDispatch
void ReleaseDispatch();
说明:
释放IDispatch连接。如果这个连接已经设置为自动释放,则在释放这个接口之前,此函数将调用Dispatch::Release。
COleDispatchDriver::SetProperty
void SetProperty(DISPID dwDispID, VARTYPE vtProp, ...);
参数:
dwDispID | 标识要设置的属性。这个值常常由ClassWizard提供。 |
vtProp | 指明要设置的属性的类型。可能的取值参见COleDispatchDriver::InvokeHelper中的说明部分。 |
... | 由vtProp指明类型的单一参数。 |
说明:设置由dwDispID指定的OLE对象属性。
COleDispatchDriver::m_bAutoRelease
说明:
如果为TRUE,则当调用ReleaseDispatch或COleDispatchDriver对象被销毁时,由m_lpDispatch访问的COM对象将被自动释放。
缺省的,在构造函数中m_bAutoRelease被设置为TRUE。
COleDispatchDriver::m_lpDispatch
说明:
这是指向连接着COleDispatchDriver的IDispatch接口的指针。m_lpDispatch数据成员是一个类型为LPDISPATCH的公用变量。