Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过COM接口以编程方式激活OLE控件?_C_Windows_Com_Ole - Fatal编程技术网

如何通过COM接口以编程方式激活OLE控件?

如何通过COM接口以编程方式激活OLE控件?,c,windows,com,ole,C,Windows,Com,Ole,我有一个通过ActiveX嵌入按钮控件的应用程序。该按钮由第三方提供,它实现了一系列ActiveX界面(其中包括)。我确实有一个参考按钮的实现 我面临的问题是,对象提供的函数总是返回一个错误;错误代码为0x80004005,这显然意味着E_FAIL。不太具有描述性 值得一提的是,该对象还通过其实现公开了一个hWnd属性;查询成功,但属性的值始终为零 谷歌搜索表明,在hWnd属性产生有用的值之前,我可能需要“激活”OLE对象。有人知道怎么做吗?有没有专门的COM接口来激活OLE对象 有趣的是,该按

我有一个通过ActiveX嵌入按钮控件的应用程序。该按钮由第三方提供,它实现了一系列ActiveX界面(其中包括)。我确实有一个参考按钮的实现

我面临的问题是,对象提供的函数总是返回一个错误;错误代码为0x80004005,这显然意味着
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宏,当给定的返回代码指示失败时,它会产生异常