2011-07-28 20 views
0

"OBJECT id = S_DetectCom codeBase = xxxx.cab ..."を使用してInternet Explorer Webページに埋め込まれたサードパーティのActiveXコンポーネント内にあるテキストを取得するタスクがあります。IEウィンドウ内のActiveXコンポーネントの処理

私はOLEおよびActiveXのに慣れていないんだけど、いくつかの研究と臨床試験を行って、私は、次の手順でActiveXオブジェクトへのIDispatchを得ることができたActiveXのDLL(4つのdllに)

を持つ.cabファイルを持っています: -

1-「Internet Explorer_Server」クラスを持つIEタブへのハンドル取得

2 - GET IHTMLDocument2 ObjectFromLresult使用

、3- GET IHTMLElementCollection IHTMLDocument2

から

、4- GETのIDispatch IHTMLElementCollectionから名前の要素を持つ "S_DetectCom"

からタイプライブラリを取得しているものを念頭に置いてあり、メソッドと、それらのパラメータを知るためのDLL tryとerrorによって、キャブ内のどのdllがそのWebページに埋め込まれているかを確認します。

今、私はInvokeに到達する方法がわかりません〜へIDispatchからの呼び出し方法は、私は、誰かがアイデアと以下の実装で私を助けることができる場合、私は感謝し

を得たあなたは、HTML文書を取得するためにWM_HTML_GETOBJECTを使用している場合はHWND

int msg; 
DWORD lRes = NULL ; 
IHTMLDocument2 *pDoc= NULL; 
IHTMLElementCollection *pElement = NULL ; 
IHTMLInputTextElement *ppvInput ; 
IDispatch *ppvDisp; 
ITypeInfo *TypeInfo = NULL ; 
VARIANT ObjName ; 
_variant_t index = NULL; 
HRESULT hr; 
LRESULT lr ; 
UINT cntTypeInf= NULL ; 
long pItems = NULL; 
BSTR pszOptText[200]; 


OleInitialize(NULL); 

msg = RegisterWindowMessage(L"WM_HTML_GETOBJECT"); 
lr = SendMessageTimeout(hwnd, msg, 0, 0, SMTO_ABORTIFHUNG, 1000, &lRes); 
hr = ObjectFromLresult((LRESULT)lRes, IID_IHTMLDocument2, 0, (void**)&pDoc); 
hr = pDoc->get_all(&pElement); 

BSTR BStrObjName = _com_util::ConvertStringToBSTR((const char *)"S_DetectCom"); 
ObjName.vt = VT_BSTR ; 
ObjName.bstrVal = BStrObjName ; 
hr = pElement->item(ObjName , index , &ppvDisp); 
if (hr == S_OK && ppvDisp) 
{ 
    hr = ppvDisp->GetTypeInfoCount(&cntTypeInf); 
    hr = ppvDisp->GetTypeInfo(NULL , NULL , &TypeInfo); 
    // to do here 

} 

答えて

0

からのIDispatchを取得するコードの一部ですあなたは現在のスレッドから外れているので、あなたは間違いなく期待される呼び出し元ではありません。 ActiveXはおそらくスレッドセーフではありません。

とにかく、ActiveXのプロパティとメソッドにアクセスするには、here are the steps(おそらくBHOをインストールすることによって)のIEのタブスレッドで実行するプロキシプラグインを取得できます。これは、Adobe Flash ActiveXにアクセスするためのものですが、import文のファイル名を変更して、ocxファイルからインタフェースをインポートすることができます。

+0

"期待される呼び出し元"とは何を意味するのでしょうか?現在のスレッドから外れていることはどういう意味ですか? – motash

+0

ほとんどのActiveXは、UIスレッド内の呼び出し用に設計されたSTAオブジェクトです。 –

0

私はあなたがCOMを直接使用しようとするのではなく、FireBreathプラグインを書いていました。このプラグインは、firefoxなどでもIEでも動作します(ActiveXコントロールとNPAPIプラグインを実装しています)。

これで、すべてのIDispatchの処理が完了し、下位レベルのクラス(IDispatchAPIを参照)を結び付けて、要素を取得してインターフェイスのクエリインターフェイスを実行した後で直接COMハンドルを取得できますあなたが必要です。

IDispatchメソッドにアクセスする方法の例として、IDispatchAPIクラスを使用できます。

関連する問題