本文主要是介绍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 =¶mDispId;
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);
这篇关于Activex宿主和寄宿者之间的运用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!