如何通过COM接口以编程方式激活OLE控件?
我有一个通过ActiveX嵌入按钮控件的应用程序。该按钮由第三方提供,它实现了一系列ActiveX界面(其中包括)。我确实有一个参考按钮的实现 我面临的问题是,对象提供的函数总是返回一个错误;错误代码为0x80004005,这显然意味着如何通过COM接口以编程方式激活OLE控件?,c,windows,com,ole,C,Windows,Com,Ole,我有一个通过ActiveX嵌入按钮控件的应用程序。该按钮由第三方提供,它实现了一系列ActiveX界面(其中包括)。我确实有一个参考按钮的实现 我面临的问题是,对象提供的函数总是返回一个错误;错误代码为0x80004005,这显然意味着E_FAIL。不太具有描述性 值得一提的是,该对象还通过其实现公开了一个hWnd属性;查询成功,但属性的值始终为零 谷歌搜索表明,在hWnd属性产生有用的值之前,我可能需要“激活”OLE对象。有人知道怎么做吗?有没有专门的COM接口来激活OLE对象 有趣的是,该按
E_FAIL
。不太具有描述性
值得一提的是,该对象还通过其实现公开了一个hWnd
属性;查询成功,但属性的值始终为零
谷歌搜索表明,在hWnd
属性产生有用的值之前,我可能需要“激活”OLE对象。有人知道怎么做吗?有没有专门的COM接口来激活OLE对象
有趣的是,该按钮似乎有一个窗口句柄,如中所示
更新:我刚刚找到了我正在处理的按钮控件实现的,可以用来“快速”(嗯…)激活一个项目。然而,填充结构似乎很痛苦,所以我现在不想这样做。自然按钮有一个有效的
HWND
,否则它不会是一个按钮/窗口。
您可以使用GetDlgItem
或类似工具获取任何控件的HWND
我也不确定如何以编程方式激活对象。我会尝试以下方法:
- 调用
。根据医生的说法,这可以满足你的需要重新激活EANDO
- 如果您有控件
(如果它存在,您肯定可以获得它)-可以模拟用户鼠标输入HWND
IOleClientSite::DoVerb
函数发送OLEIVERB\u INPLACEACTIVATE
动词有帮助,如下所示:
IOleInPlaceObjectPtr oleInPlaceObj;
CheckAndThrow( unk->QueryInterface( &oleInPlaceObj ) ) );
HWND hwnd;
CheckAndThrow( oleInPlaceObj->GetWindow( &hwnd ) );
IOleObjectPtr oleObj;
if ( SUCCEEDED( unk->QueryInterface( &oleObj ) ) ) {
IOleClientSitePtr clientSite;
if ( SUCCEEDED( oleObj->GetClientSite( &clientSite ) ) ) {
hr = oleObj->DoVerb( OLEIVERB_INPLACEACTIVATE,
NULL,
clientSite,
0,
NULL,
NULL );
if ( SUCCEEDED( hr ) ) {
if ( SUCCEEDED( oleInPlaceObj->GetWindow( &hwnd ) ) ) {
return hwnd;
}
}
}
}
unk
是一个IUnknownPtr
,我正试图获取它的HWND
。CheckAndThrow
函数是一个helper宏,当给定的返回代码指示失败时,它会产生异常