"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
}
"期待される呼び出し元"とは何を意味するのでしょうか?現在のスレッドから外れていることはどういう意味ですか? – motash
ほとんどのActiveXは、UIスレッド内の呼び出し用に設計されたSTAオブジェクトです。 –