COleDispatchDriver 类

实现 OLE 自动化的客户端。

语法

class COleDispatchDriver

成员

公共构造函数

名称 描述
COleDispatchDriver::COleDispatchDriver 构造 COleDispatchDriver 对象。

公共方法

名称 描述
COleDispatchDriver::AttachDispatch IDispatch 连接附加到 COleDispatchDriver 对象。
COleDispatchDriver::CreateDispatch 创建 IDispatch 连接并将其附加到 COleDispatchDriver 对象。
COleDispatchDriver::DetachDispatch 分离 IDispatch 连接,而不释放它。
COleDispatchDriver::GetProperty 获取自动化属性。
COleDispatchDriver::InvokeHelper 用于调用自动化方法的帮助程序。
COleDispatchDriver::ReleaseDispatch 释放 IDispatch 连接。
COleDispatchDriver::SetProperty 设置自动化属性。

公共运算符

“属性” 描述
COleDispatchDriver::operator = 将源值复制到 COleDispatchDriver 对象中。
COleDispatchDriver::operator LPDISPATCH 访问基础 IDispatch 指针。

公共数据成员

“属性” 描述
COleDispatchDriver::m_bAutoRelease 指定是否在 ReleaseDispatch 或对象析构期间释放 IDispatch
COleDispatchDriver::m_lpDispatch 指示指向附加到 COleDispatchDriverIDispatch 对象的指针。

备注

COleDispatchDriver 没有基类。

OLE 调度接口提供对对象的方法和属性的访问权限。 COleDispatchDriver 的成员函数会附加、分离、创建和释放类型 IDispatch 的调度连接。 其他成员函数使用变量参数列表来简化调用 IDispatch::Invoke

此类可以直接使用,但通常仅由“添加类”向导创建的类使用。 通过导入类型库创建新的 C++ 类时,新类派生自 COleDispatchDriver

有关使用 COleDispatchDriver 的详细信息,请参阅以下文章:

继承层次结构

COleDispatchDriver

要求

标头:afxdisp.h

COleDispatchDriver::AttachDispatch

调用 AttachDispatch 成员函数以将 IDispatch 指针附加到 COleDispatchDriver 对象。 有关更多信息,请参见 Implementing the IDispatch Interface

void AttachDispatch(
    LPDISPATCH lpDispatch,
    BOOL bAutoRelease = TRUE);

参数

lpDispatch
指向 OLE IDispatch 对象的指针被附加到 COleDispatchDriver 对象。

bAutoRelease
指定当此对象超出范围时是否要释放调度。

备注

此函数会释放任何 IDispatch 已附加到 COleDispatchDriver 对象的指针。

示例

void COleContainerView::OnAttachDispatch()
{
   CLSID clsidWMP;
   LPDISPATCH pWMPDispatch = NULL;
   COleDispatchDriver oddWMP;

   try
   {
      AfxCheckError(::CLSIDFromProgID(_T("WMPlayer.OCX"), &clsidWMP));

      AfxCheckError(::CoCreateInstance(clsidWMP, NULL, CLSCTX_INPROC_SERVER,
         IID_IDispatch, (LPVOID*)& pWMPDispatch));

      oddWMP.AttachDispatch(pWMPDispatch, TRUE);
      pWMPDispatch = NULL; // our COleDispatchDriver now owns the interface

      CString strUIMode;
      oddWMP.GetProperty(23, VT_BSTR, (void*)& strUIMode);
      TRACE(_T("WMP uiMode is %s.\n"), strUIMode);
   }
   catch (COleException* pe)
   {
      pe->ReportError();
      pe->Delete();
   }
   catch (CMemoryException* pe)
   {
      pe->ReportError();
      pe->Delete();
   }

   // cleanup
   if (NULL != pWMPDispatch)
   {
      pWMPDispatch->Release();
   }

   // COleDispatchDriver automatically releases the dispatch interface when
   // it goes out of scope if m_bAutoRelease is TRUE.
}

COleDispatchDriver::COleDispatchDriver

构造 COleDispatchDriver 对象。

COleDispatchDriver();
COleDispatchDriver(LPDISPATCH lpDispatch, BOOL bAutoRelease = TRUE);
COleDispatchDriver(const COleDispatchDriver& dispatchSrc);

参数

lpDispatch
指向 OLE IDispatch 对象的指针被附加到 COleDispatchDriver 对象。

bAutoRelease
指定当此对象超出范围时是否要释放调度。

dispatchSrc
对现有 COleDispatchDriver 对象的引用。

备注

窗体 COleDispatchDriver( LPDISPATCH lpDispatch, BOOL bAutoRelease = TRUE ) 连接 IDispatch 接口。

窗体 COleDispatchDriver( const COleDispatchDriver& dispatchSrc ) 复制现有 COleDispatchDriver 对象并递增引用计数。

窗体 COleDispatchDriver( ) 创建一个 COleDispatchDriver 对象,但不连接 IDispatch 接口。 在使用无参数的 COleDispatchDriver( ) 之前,应使用 COleDispatchDriver::CreateDispatchCOleDispatchDriver::AttachDispatchIDispatch 连接到它。 有关更多信息,请参见 Implementing the IDispatch Interface

示例

请参阅 COleDispatchDriver::CreateDispatch的示例。

COleDispatchDriver::CreateDispatch

创建一个 IDispatch 接口对象,并将其附加到 COleDispatchDriver 对象。

BOOL CreateDispatch(
    REFCLSID clsid,
    COleException* pError = NULL);

BOOL CreateDispatch(
    LPCTSTR lpszProgID,
    COleException* pError = NULL);

参数

clsid
要创建的 IDispatch 连接对象的类 ID。

pError
指向 OLE 异常对象的指针,它将保存因创建而产生的状态代码。

lpszProgID
指向要为其创建调度对象的自动化对象的编程标识符的指针,如“Excel.Document.5”。

返回值

若成功,则为非零;否则为 0。

示例

void COleContainerView::OnCreateDispatch()
{
   COleDispatchDriver disp;
   COleException* pe = new COleException;

   try
   {
      // Create instance of Microsoft System Information Control 
      // by using ProgID.
      if (disp.CreateDispatch(_T("WMPlayer.OCX"), pe))
      {
         //Get uiMode.     
         CString strUIMode;
         disp.InvokeHelper(23, DISPATCH_PROPERTYGET, VT_BSTR,
            (void*)& strUIMode, NULL);

         CString strMsg;
         strMsg.Format(_T("WMP uiMode is %s."), strUIMode);
         AfxMessageBox(strMsg);
      }
      else
      {
         throw pe;
      }
   }
   //Catch control-specific exceptions.
   catch (COleDispatchException* pe)
   {
      CString cStr;

      if (!pe->m_strSource.IsEmpty())
         cStr = pe->m_strSource + _T(" - ");
      if (!pe->m_strDescription.IsEmpty())
         cStr += pe->m_strDescription;
      else
         cStr += _T("unknown error");

      AfxMessageBox(cStr, MB_OK,
         (pe->m_strHelpFile.IsEmpty()) ? 0 : pe->m_dwHelpContext);

      pe->Delete();
   }
   //Catch all MFC exceptions, including COleExceptions.
   // OS exceptions will not be caught.
   catch (CException* pe)
   {
      TRACE(_T("%s(%d): OLE Execption caught: SCODE = %x"),
         __FILE__, __LINE__, COleException::Process(pe));
      pe->Delete();
   }

   pe->Delete();
}

COleDispatchDriver::DetachDispatch

从此对象分离当前 IDispatch 连接。

LPDISPATCH DetachDispatch();

返回值

指向以前附加的 OLE IDispatch 对象的指针。

备注

不会释放 IDispatch

有关 LPDISPATCH 类型的详细信息,请参阅在 Windows SDK 中实现 IDispatch 接口

示例

LPDISPATCH CreateLPDispatch(LPCTSTR lpszProgId)
{
   COleDispatchDriver disp;

   disp.CreateDispatch(lpszProgId);

   return disp.DetachDispatch();
}

COleDispatchDriver::GetProperty

获取 dwDispID 指定的控件属性。

void GetProperty(
    DISPID dwDispID,
    VARTYPE vtProp,
    void* pvProp) const;

参数

dwDispID
标识要检索的属性。

vtProp
指定要检索的属性。 有关可能的值,请参阅备注部分 COleDispatchDriver::InvokeHelper

pvProp
将接收属性值的变量的地址。 它必须与 vtProp 指定的类型匹配。

示例

CString IMyComObject::GetString(DISPID dispid)
{
   CString result;
   GetProperty(dispid, VT_BSTR, (void*)& result);
   return result;
}

COleDispatchDriver::InvokeHelper

wFlags 指定的上下文中调用 dwDispID 指定的对象方法或属性。

void AFX_CDECL InvokeHelper(
    DISPID dwDispID,
    WORD wFlags,
    VARTYPE vtRet,
    void* pvRet,
    const BYTE* pbParamInfo, ...);

参数

dwDispID
标识要调用的方法或属性。

wFlags
描述 IDispatch::Invoke 调用上下文的标志。 。 有关可能值的列表,请参阅 Windows SDK 中 IDispatch::Invoke 中的 wFlags 参数。

vtRet
指定返回值的类型。 有关可能值,请参阅“备注”部分。

pvRet
将接收属性值或返回值的变量的地址。 它必须与 vtRet 指定的类型匹配。

pbParamInfo
指向以 null 结尾的字节字符串的指针,可指定 pbParamInfo 后面的参数的类型。

[.]
具有 pbParamInfo 中指定的类型的参数的变量列表。

备注

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

pbParamInfo 参数是 VTS_ 常量的以空格分隔的列表。 其中一个或多个值(由空格(而不是逗号)分隔)指定函数的参数列表。 可能值使用 EVENT_CUSTOM 宏来列出。

此函数将参数转换为 VARIANTARG 值,然后调用 IDispatch::Invoke 方法。 如果 Invoke 调用失败,则此函数会引发异常。 如果 IDispatch::Invoke 返回的 SCODE(状态代码)是 DISP_E_EXCEPTION,此函数会引发 COleException 对象;否则引发 COleDispatchException

有关详细信息,请参阅 VARIANTARG实现 IDispatch 接口IDispatch::Invoke 以及 Windows SDK 中的 COM 错误代码结构

示例

请参阅 COleDispatchDriver::CreateDispatch的示例。

COleDispatchDriver::m_bAutoRelease

如果为 TRUE,则调用 ReleaseDispatch 或销毁此 COleDispatchDriver 对象时,m_lpDispatch 访问的 COM 对象将自动释放。

BOOL m_bAutoRelease;

注解

默认情况下,m_bAutoRelease 在构造函数中设置为 TRUE。

有关释放 COM 对象的详细信息,请参阅在 Windows SDK 中 实现引用计数IUnknown::Release

示例

// Clean up by forcing Release to be called
// on COleDispatchDriver object and delete
if (bError)
{
   pDisp->m_bAutoRelease = TRUE;
   delete pDisp;
   pDisp = NULL;
}

COleDispatchDriver::m_lpDispatch

指向附加到 COleDispatchDriverIDispatch 接口的指针。

LPDISPATCH m_lpDispatch;

备注

m_lpDispatch 数据成员是类型 LPDISPATCH 的公共变量。

有关详细信息,请参阅 Windows SDK 中的 IDispatch

示例

请参阅 COleDispatchDriver::AttachDispatch 的示例。

COleDispatchDriver::operator =

将源值复制到 COleDispatchDriver 对象中。

const COleDispatchDriver& operator=(const COleDispatchDriver& dispatchSrc);

参数

dispatchSrc
指向现有 COleDispatchDriver 对象的指针。

COleDispatchDriver::operator LPDISPATCH

访问 COleDispatchDriver 对象的基础 IDispatch 指针。

operator LPDISPATCH();

示例

COleDispatchDriver disp;
if (disp.CreateDispatch(_T("WMPlayer.OCX")))
{
   IDispatch* pDispatch = disp; //COleDispatchDriver::operator
                                //LPDISPATCH is called here
   IUnknown* pUnkn = NULL;
   HRESULT hr = pDispatch->QueryInterface(IID_IUnknown, (void**)& pUnkn);
   if (SUCCEEDED(hr))
   {
      //Do something...
      pUnkn->Release();
   }
}

COleDispatchDriver::ReleaseDispatch

释放 IDispatch 连接。 有关更多信息,请参见实现 IDispatch 接口

void ReleaseDispatch();

备注

如果为此连接设置了自动释放,则此函数会在释放接口之前调用 IDispatch::Release

示例

请参阅 COleDispatchDriver::AttachDispatch 的示例。

COleDispatchDriver::SetProperty

设置 dwDispID 指定的 OLE 对象属性。

void AFX_CDECL SetProperty(
    DISPID dwDispID,
    VARTYPE vtProp, ...);

参数

dwDispID
标识要设置的属性。

vtProp
指定要设置的属性的类型。 有关可能的值,请参阅备注部分 COleDispatchDriver::InvokeHelper

[.]
由 vtProp 指定的类型的单个参数

示例

void IMyComObject::SetString(DISPID dispid, LPCTSTR propVal)
{
   SetProperty(dispid, VT_BSTR, propVal);
}

另请参阅

MFC 示例 CALCDRIV
MFC 示例 ACDUAL
层次结构图
CCmdTarget 类