2011-05-19 44 views
2

我有一個通過ActiveX嵌入按鈕控件的應用程序。該按鈕被由第三方提供,並它實現的的ActiveX接口的整個範圍(其中是IOleInPlaceObject)。我確實參照了IUnknown這個按鈕的實現。如何以編程方式通過COM接口激活OLE控件?

我現在面臨的問題是,由對象提供的IOleWindow::GetWindow函數總是返回一個錯誤;錯誤代碼是0x80004005的這顯然是一個common HRESULT value含義E_FAIL。不太具描述性。

對於它的價值,該對象還通過IDispatch實現公開了hWnd屬性;查詢成功,但該屬性的值始終爲零。

谷歌搜索的位建議hWnd屬性產生一個有用的值之前,我可能需要「激活」 OLE對象。有誰知道如何做到這一點,有沒有專用的COM接口來激活OLE對象?

有趣的是,按鈕確實似乎有一個窗口句柄,如在Spy++中可見。

更新:我剛剛發現IQuickActivate這是由我負責的按鈕控制實現的,它可以用來「快速」(啊哈...)啓動一個項目。然而,填寫QACONTAINER結構似乎很痛苦,所以我現在寧願不這樣做。

回答

1

原來發送使用IOleClientSite::DoVerb功能OLEIVERB_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; 
      } 
     } 
    } 
} 

unkIUnknownPtr爲此,我試圖讓HWNDCheckAndThrow函數是一個輔助宏,在給定的返回碼指示失敗的情況下產生一個異常。

0

自然按鈕有一個有效的HWND,othrewise它不會是一個按鈕/窗口。 您可以通過使用GetDlgItem或類似得到任何控制的HWND

我不確定如何以編程方式激活對象。我會嘗試以下方法:

  • 致電ReactivateAndUndo。根據文件這可能會做你需要恕我直言。
  • 如果你有控制HWND(和你,如果它存在,完全可以得到它) - 它可以模擬用戶的鼠標輸入
相關問題