2011-07-28 3 views
0

"OBJECT id = S_DetectCom codeBase = xxxx.cab ..."를 사용하여 Internet Explorer 웹 페이지에 포함 된 타사 ActiveX 구성 요소 안에있는 일부 텍스트를 가져 오는 작업이 있습니다.IE 창에서 ActiveX 구성 요소를 처리하는 중

내가이 .CAB 파일을 갖는 액티브 X DLL을 (4 DLL을)

내가 OLE 및 ActiveX에 익숙하지 않은 해요,하지만 약간의 연구와 실험을하고, 내가 다음 단계로 ActiveX 객체에의 IDispatch를 얻을 수 있습니다 : -

1- "Internet Explorer_Server"클래스를 가진 IE 탭에 대한 핸들 얻기

ObjectFromLresult

를 사용하여

2 GET IHTMLDocument2에 3 IHTMLDocument2에

에서 IHTMLElementCollection를 얻을

3- GET IDispatch를 염두에 무슨 일이 있을지

"S_DetectCom"이름의 요소의 형식 라이브러리를 얻고있다와 IHTMLElementCollection에서 메서드와 ... 및 해당 매개 변수를 알기위한 DLL try 및 error를 통해 택시의 dll이 해당 웹 페이지에 포함되어 있는지 확인합니다.

현재 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는 스레드로부터 안전하지 않을 수 있습니다.

어쨌든 (아마도 BHO를 설치하여) IE의 탭 스레드에서 프록시 플러그인을 실행할 수 있다면 here are the steps을 사용하여 ActiveX의 속성 및 메서드에 액세스 할 수 있습니다. Adobe Flash ActiveX에 액세스하기위한 것이지만 가져 오기 문에서 파일 이름을 변경하여 ocx 파일에서 인터페이스를 가져올 수 있습니다.

+0

"예상 호출자"가 의미하는 바를 더 많이 지정할 수 있으며 현재 스레드에서 벗어나는 것은 무엇을 의미합니까? – motash

+0

대부분의 ActiveX는 UI 스레드 내의 호출을 위해 설계된 STA 개체입니다. –

0

내가 COM을 직접 사용하려고하지 않고 대신 FireBreath 플러그인을 작성하면 Firefox뿐만 아니라 IE에서도 작동합니다 (ActiveX 컨트롤과 NPAPI 플러그인을 구현 함).

모든 IDispatch 작업을 수행 한 다음 하위 수준 클래스 (IDispatchAPI 참조)를 연결하여 요소를 가져온 후 해당 요소에 대한 직접적인 COM 처리를 가져오고 인터페이스에 대한 쿼리 인터페이스를 수행 할 수 있습니다 너는 필요해.

다른 경우 IDispatch 메서드에 액세스하는 방법의 예로 IDispatchAPI 클래스를 사용할 수 있습니다.

관련 문제