C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[47567] ActiveX에서 자바스크립트 호출 해 보신분 계신가요?
leo21c [leo21c] 6542 읽음    2006-12-27 15:56
안녕하세요.
지금 거의 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//

+ -

관련 글 리스트
47567 ActiveX에서 자바스크립트 호출 해 보신분 계신가요? leo21c 6542 2006/12/27
47572     Re:ActiveX에서 자바스크립트 호출 해 보신분 계신가요? 2902 2006/12/27
47576         제가 테스트를 잘 못 한 것 같습니다. 잘되네요. ^^~ leo21c 1572 2006/12/28
48740             Re:저는 에러가 나네요.ㅠ.ㅠ 넘초보 1688 2007/04/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.