소스중
hr = pDoc->get_Script(&pDisp);
라인에서 컴파일 오류가 나네요..
혹 아시면 답글 부탁 드려요.
leo21c 님이 쓰신 글 :
: ㅁ 님이 쓰신 글 :
: : 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 파일이 어떤 이유에선가 새 버전으로 업데이트가 안 되고 있다든가....