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控件”的原因,希望哪位大哥知道该怎么解决的能告知下,感激不尽
我将设置改为:
属性-常规-MFC的使用:使用标准 Windows 库
则发现激活控件时hr = pObject->DoVerb(OLEIVERB_SHOW,0,pContainer,0,hWnd,0)会返回E_FAIL
我将其改成:
属性-常规-MFC的使用:在共享 DLL 中使用 MFC
则返回正确S_OK
不知是不是因为我新建的是“MFC ActiveX控件”的原因,希望哪位大哥知道该怎么解决的能告知下,感激不尽
#3
可能控件需要MFC支持.
#4
可是很奇怪的是我把他改成:在静态库中使用 MFC
照样还是会报错
真不知道为啥。。。一定要是:在共享 DLL 中使用 MFC
才不报错
#5
问题已解决,是由于IOleClientSite和IOleInPlaceSite中的GetWindowContext和OnUIActivate这两个接口函数未实现导致的
“在静态库中使用 MFC”需要实现这两个接口,否则DoVerb会返回失败
“在静态库中使用 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控件”的原因,希望哪位大哥知道该怎么解决的能告知下,感激不尽
我将设置改为:
属性-常规-MFC的使用:使用标准 Windows 库
则发现激活控件时hr = pObject->DoVerb(OLEIVERB_SHOW,0,pContainer,0,hWnd,0)会返回E_FAIL
我将其改成:
属性-常规-MFC的使用:在共享 DLL 中使用 MFC
则返回正确S_OK
不知是不是因为我新建的是“MFC ActiveX控件”的原因,希望哪位大哥知道该怎么解决的能告知下,感激不尽
#3
可能控件需要MFC支持.
#4
可是很奇怪的是我把他改成:在静态库中使用 MFC
照样还是会报错
真不知道为啥。。。一定要是:在共享 DLL 中使用 MFC
才不报错
#5
问题已解决,是由于IOleClientSite和IOleInPlaceSite中的GetWindowContext和OnUIActivate这两个接口函数未实现导致的
“在静态库中使用 MFC”需要实现这两个接口,否则DoVerb会返回失败
“在静态库中使用 MFC”需要实现这两个接口,否则DoVerb会返回失败
#6
GetWindowContext和OnUIActivate这两个接口函数接口该如何实现呢?
#7
我也遇到这个问题了