调用DoVerb激活控件总是失败

时间:2022-09-13 19:02:46
问题如标题
HRESULT CreateAxControl(HWND hWnd,const wchar_t * ProgId,IUnknown ** ppControlUnknown,IUnknown ** ppContainerUnknown)
{
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);
if (FAILED(hr)) goto exit1;

pContainer = new CControlContainer(hWnd);
hr = pObject->SetClientSite(pContainer);
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);
pContainer->QueryInterface(IID_IUnknown,(void**)ppContainerUnknown);
hr = S_OK;
exit1:
if (pObject) pObject->Release();
if (pContainer) pContainer->Release();
return hr;
}

当我调用CreateAxControl载入flash时会成功
HRESULT hr = CreateAxControl(hWnd,L"ShockwaveFlash.ShockwaveFlash",&pControl,&pContainer);
但是当我载入自己写的一个ActiveX控件则会失败
HRESULT hr = CreateAxControl(hWnd,L"MYGAMEX.MyGameXCtrl.1",&pControl,&pContainer);
代码调试发现在激活控件时总返回失败
hr = pObject->DoVerb(OLEIVERB_SHOW,0,pContainer,0,hWnd,0);

紧急求救这是为啥

7 个解决方案

#1


自己顶

#2


初步判断,是由于项目属性设置引起的,但是不知为何

我将设置改为:
属性-常规-MFC的使用:使用标准 Windows 库
则发现激活控件时hr = pObject->DoVerb(OLEIVERB_SHOW,0,pContainer,0,hWnd,0)会返回E_FAIL

我将其改成:
属性-常规-MFC的使用:在共享 DLL 中使用 MFC
则返回正确S_OK

不知是不是因为我新建的是“MFC ActiveX控件”的原因,希望哪位大哥知道该怎么解决的能告知下,感激不尽

#3


可能控件需要MFC支持.

#4


引用 3 楼  的回复:
可能控件需要MFC支持.


可是很奇怪的是我把他改成:在静态库中使用 MFC
照样还是会报错

真不知道为啥。。。一定要是:在共享 DLL 中使用 MFC
才不报错

#5


问题已解决,是由于IOleClientSite和IOleInPlaceSite中的GetWindowContext和OnUIActivate这两个接口函数未实现导致的
“在静态库中使用 MFC”需要实现这两个接口,否则DoVerb会返回失败

#6


GetWindowContext和OnUIActivate这两个接口函数接口该如何实现呢?

#7


我也遇到这个问题了

#1


自己顶

#2


初步判断,是由于项目属性设置引起的,但是不知为何

我将设置改为:
属性-常规-MFC的使用:使用标准 Windows 库
则发现激活控件时hr = pObject->DoVerb(OLEIVERB_SHOW,0,pContainer,0,hWnd,0)会返回E_FAIL

我将其改成:
属性-常规-MFC的使用:在共享 DLL 中使用 MFC
则返回正确S_OK

不知是不是因为我新建的是“MFC ActiveX控件”的原因,希望哪位大哥知道该怎么解决的能告知下,感激不尽

#3


可能控件需要MFC支持.

#4


引用 3 楼  的回复:
可能控件需要MFC支持.


可是很奇怪的是我把他改成:在静态库中使用 MFC
照样还是会报错

真不知道为啥。。。一定要是:在共享 DLL 中使用 MFC
才不报错

#5


问题已解决,是由于IOleClientSite和IOleInPlaceSite中的GetWindowContext和OnUIActivate这两个接口函数未实现导致的
“在静态库中使用 MFC”需要实现这两个接口,否则DoVerb会返回失败

#6


GetWindowContext和OnUIActivate这两个接口函数接口该如何实现呢?

#7


我也遇到这个问题了