안녕하세요.
지금 거의 2주동안 계속 해결책을 찾지 못하고 있습니다.
웹브라우저에 ActiveX를 넣고 그 페이지의 자바스크립트를 호출 하려고 하는데 잘 되지 않네요.
자료는 엄청 많은 것 같고 이것, 저것 해 보았습니다만 디버깅도 할 수 없고 테스트를 못해 보니 힘드네요.
혹시 해 보신 분이 계시면 답변 부탁드립니다.
제가 만든 함수들입니다.
WebExecBtnXImpl, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA>
{
void __fastcall ClickEvent(TObject *Sender);
void __fastcall KeyPressEvent(TObject *Sender, char &Key);
IWebBrowser2* GetIWebPointer(); // Web 포인터를 구하기 위한 함수
public:
void InitializeControl()
{
m_VclCtl->OnClick = ClickEvent;
m_VclCtl->OnKeyPress = KeyPressEvent;
}
.
.
줄략
.
.
protected:
.
.
STDMETHOD(InvokeScript2());
};
다음은 mpl.cpp파일에서 만들어 놓은 함수입니다.
STDMETHODIMP TWebExecBtnXImpl::InvokeScript2()
{
HRESULT hr;
IWebBrowser2 * pparent=NULL;
pparent = (IWebBrowser2*)GetIWebPointer();
LPDISPATCH lpDispatch = NULL;
hr = pparent->get_Document(&lpDispatch);
if (!SUCCEEDED(hr))
{
// AfxMessageBox("error get document");
lpDispatch->Release();
return S_FALSE;
}
IHTMLDocument2 *m_pDoc2;
hr = lpDispatch->QueryInterface(IID_IHTMLDocument2, (void**) &m_pDoc2);
if (!SUCCEEDED(hr))
{
// AfxMessageBox("error get document interface");
m_pDoc2->Release();
return S_FALSE;
}
CComQIPtr<IHTMLDocument> pDoc(m_pDoc2);
//
// 스크립트 엔진의 디스패치 를 얻는다.
//
CComPtr< IDispatch > pDisp;
hr = pDoc->get_Script(&pDisp);
//
// 스크립트 엔진디스패치에서 주어진 함수를 찾는다. 즉 dispid를 세트.
//
OLECHAR FAR* szFunctionName = L"editImage"; // 호출할 Javascript 명
DISPID dispid;
hr = pDisp->GetIDsOfNames( IID_NULL, &szFunctionName, 1,
LOCALE_SYSTEM_DEFAULT, &dispid);
//
// Invoke하기 위한 파라미터 세트.
//
DISPPARAMS dispParams;
dispParams.rgvarg = NULL;
dispParams.rgdispidNamedArgs = NULL;
dispParams.cArgs = 0;
dispParams.cNamedArgs = 0;
hr = pDisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD, &dispParams, NULL, NULL, NULL);
pparent->Release();
return S_OK;
}
IWebBrowser2* TWebExecBtnXImpl::GetIWebPointer()
{
HRESULT hr;
IOleContainer *pIContainer = NULL;
IWebBrowser2 *pIWeb = NULL;
IServiceProvider *pISP = NULL;
LPOLECLIENTSITE pIClientSite;
GetClientSite(&pIClientSite);
hr = pIClientSite->GetContainer(&pIContainer);
if (hr != S_OK) {
pIClientSite->Release();
return NULL;
}
hr = pIClientSite->QueryInterface(IID_IServiceProvider, (void**)&pISP);
if (hr != S_OK) {
pIContainer->Release();
pIClientSite->Release();
return NULL;
}
hr = pISP->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void**)&pIWeb);
if (hr != S_OK) {
pIContainer->Release();
pIClientSite->Release();
pISP->Release();
return NULL;
}
pIContainer->Release();
pIClientSite->Release();
pISP->Release();
return pIWeb;
}
////////////////////////////////////////////////////////////////////////////////////////////////
아래는 테스트를 위해서 만들어 놓은 html함수입니다.
//Script language="JavaScript">
function cmdOK(){
ScriptUser.WebExec();
}
function editImage()
{
document.all.aaa.value = "OK";
}
function test()
{
ScriptUser.InvokeScript2();
}
///script>
//OBJECT id="ScriptUser" width=0 height=0
classid="clsid:9DE3E062-96F3-4572-A10D-04C210056459"
codebase="
http://61.251.191.12/WebExecBtnXControl.ocx#version=1,0,2,0">
///OBJECT>
///BODY///
//input type="BUTTON" name="runTexpro" value="runTexpro" onClick="cmdOK()">
//input type="text" name="aaa" value="">
//input type="BUTTON" name="test" value="test" onClick="editImage()">
//input type="BUTTON" name="test" value="test2" onClick="test()">
////BODY//