Activex宿主和寄宿者之间的运用

       宿主和寄宿者之间只是为了方便理解的一个称谓,而实际上是没有这种说法的。

      Acitvex控件浏览文件,诸如Excel,Flash,html 都需要实现所谓的客户端和服务端程序组件,加以控制最后显示给用户 IOleObject作为服务控件的一个借口提供了设置客户端接口的一个方法SetClientSite,只要实现IOleClientSite ,通过实例化IOleClientSite(关键字:NEW)接口【IOleInPlaceSite】。其中IOleCLientSite构造函数中需要一个容纳activex控件的窗口句柄。

 

      调用如下:

        HRESULT hr;
CLSID cls;
IOleObject * pObject = NULL;
CControlContainer * pContainer = NULL;
hr = CLSIDFromProgID(ProgId,&cls);
if (FAILED(hr)) goto exit1;

hr=CoCreateInstance(cls,NULL,CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER|CLSCTX_LOCAL_SERVER,IID_IOleObject,(void**)&pObject);//创建一个acitvex控件
if (FAILED(hr)) goto exit1;


pContainer = new CControlContainer(hWnd);//实例化宿主客户端
hr = pObject->SetClientSite(pContainer);//activex控件宿主
if (FAILED(hr)) goto exit1;
hr = pObject->DoVerb(OLEIVERB_SHOW,0,pContainer,0,hWnd,0);//激活控件 指定控件的父窗体
if (FAILED(hr)) goto exit1;


    pObject->QueryInterface(IID_IUnknown,(void**)ppControlUnknown);//取得activex控件的IUnknown 指针 
pContainer->QueryInterface(IID_IUnknown,(void**)ppContainerUnknown);//取得宿主的指针
hr = S_OK;
exit1:
if (pObject) pObject->Release();
if (pContainer) pContainer->Release();
return hr;

      

     显示Flash影片:

       注意:hr = CLSIDFromProgID(”ShockwaveFlash.ShockwaveFlash.11“,&cls);的ProgID,在注册表中可以找到

        IDispatch * pDisp = NULL;
HRESULT hr;
DISPID propId;
const wchar_t * ppNames[] = {prop};
DISPPARAMS dispparams;
DISPID paramDispId;
hr = pUnk->QueryInterface(IID_IDispatch,(void**)&pDisp);
if (FAILED(hr)) return hr;
//Query prop id
hr = pDisp->GetIDsOfNames(IID_NULL,(LPOLESTR*)ppNames,1,LANG_SYSTEM_DEFAULT,&propId);
if (FAILED(hr)) goto exit1;
//call
paramDispId = DISPID_PROPERTYPUT;
dispparams.cArgs = 1;
dispparams.cNamedArgs = 1;
dispparams.rgdispidNamedArgs =&paramDispId;
dispparams.rgvarg = pVal;
hr = pDisp->Invoke(propId,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_PROPERTYPUT,&dispparams,NULL,NULL,NULL);
exit1:
if (pDisp) pDisp->Release();
return hr;

   

       另窗体主写的话,需要在Main函数的WM_CREATE中添加以下代码:

       IUnknown * pControl;
IUnknown * pContainer;
HRESULT hr = CreateAxControl(hWnd,L"ShockwaveFlash.ShockwaveFlash.11",&pControl,&pContainer);

   

      

    

    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值