leo21c 님이 쓰신 글 :
: 안녕하세요.
: 지금 거의 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//
제시하신 코드 대로 해보니 잘 됩니다.
프로그램 보다는 설정에 문제가 있지 않을까 추측해봅니다.
예를 들어, Object 태그의 codebase 속성에 설정한 위치에 실제로 해당 ocx 파일이 있는 것인지...
또는, 프로그램 제작 과정에서 수정, 배포, 테스트를 여러번 하면서 로컬 하드디스크에 다운로드되어 저장된 구 버전의 해당 ocx 파일이 어떤 이유에선가 새 버전으로 업데이트가 안 되고 있다든가....