유돌이

calendar

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

Notice

2009. 6. 26. 13:57 델파이

uses
 
ActiveX, Shdocvw_tlb, MSHTML_TLB;

type
 
TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; wParam: wParam;
    out pObject): HRESULT;
  stdcall;

function GetIEFromHWND(WHandle: HWND; var IE: IWebbrowser2): HRESULT;
var
 
hInst: HWND;
  lRes: Cardinal;
  Msg: Integer;
  pDoc: IHTMLDocument2;
  ObjectFromLresult: TObjectFromLresult;
begin
 
hInst := LoadLibrary('Oleacc.dll'); @ObjectFromLresult :=
    GetProcAddress(hInst, 'ObjectFromLresult');
  if @ObjectFromLresult <> nil then
  begin
    try
     
Msg := RegisterWindowMessage('WM_HTML_GETOBJECT');
      SendMessageTimeOut(WHandle, Msg, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
      Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);
      if Result = S_OK then
       
(pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp,
          IWebbrowser2, IE);
    finally
     
FreeLibrary(hInst);
    end;
  end;
end;

 

 

[※ 참고]

: 프레임의 경우엔 프레임의 인터페이스를 얻는 방법과 Shell Embedding 이란 클래스 핸들을 얻어서 다시 Shell DocObject View 클래스 핸들을 얻고, 다시 Internet Explorer_Server 핸들을 얻으면 됩니다. 그러니까 프레임은 Shell Embedding 클래스 안에 Shell DocObject View가 여러개 있는게 되죠...^^;

 

 

 

 

출처 : http://skyrack.tistory.com/45#recentTrackback 

사진찍는 나귀

posted by 유돌이
2009. 5. 26. 20:24 델파이

uses
 
ActiveX, Shdocvw_tlb, MSHTML_TLB;

type
 
TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; wParam: wParam;
    out pObject): HRESULT;
  stdcall;

function GetIEFromHWND(WHandle: HWND; var IE: IWebbrowser2): HRESULT;
var
 
hInst: HWND;
  lRes: Cardinal;
  Msg: Integer;
  pDoc: IHTMLDocument2;
  ObjectFromLresult: TObjectFromLresult;
begin
 
hInst := LoadLibrary('Oleacc.dll'); @ObjectFromLresult :=
    GetProcAddress(hInst, 'ObjectFromLresult');
  if @ObjectFromLresult <> nil then
  begin
    try
     
Msg := RegisterWindowMessage('WM_HTML_GETOBJECT');
      SendMessageTimeOut(WHandle, Msg, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
      Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);
      if Result = S_OK then
       
(pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp,
          IWebbrowser2, IE);
    finally
     
FreeLibrary(hInst);
    end;
  end;
end;

 

 

[※ 참고]

: 프레임의 경우엔 프레임의 인터페이스를 얻는 방법과 Shell Embedding 이란 클래스 핸들을 얻어서 다시 Shell DocObject View 클래스 핸들을 얻고, 다시 Internet Explorer_Server 핸들을 얻으면 됩니다. 그러니까 프레임은 Shell Embedding 클래스 안에 Shell DocObject View가 여러개 있는게 되죠...^^;

 

 

 

 

출처 : http://skyrack.tistory.com/45#recentTrackback 

사진찍는 나귀

posted by 유돌이
2008. 12. 20. 12:04 ATL / WTL

순수하게 win32 만으로 할려니까...  어렵네요...

간단하게 atl 로 dialog 에 web browser 띄우는 것을 해 보겠습니다.
차례대로 따라 하세요.

1. AtlCom Object Wizard 로 들어갑니다. (이름을 마음대로 만드세요)
2. type 은 DLL, (실행, 서비스)EXE 가 있는데... 실행 EXE 하세요.
3. 프로젝트가 생성 되었고, Menu/insert/New ATL Object 를 선택하시면
 3번째 분류에 Dialog 라는 것이 있습니다. 
 short name 만 지정하시고 만듭니다.
4. 다이얼로그가 생성되는데 여기다가 오른쪽 클릭후 Insert ActiveX 에서 
   Microsoft 웹 브라우저를 선택해서 추가합니다.  적당하게 Dlg 를 눌려주세요
5. 다이얼로그의 OnInitDialog()를 다음과 같이고치세요.

LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
  HRESULT     hr;
  CComPtr spIE;
  
  m_IEHost = GetDlgItem(IDC_EXPLORER1);
  hr = m_IEHost.QueryControl(IID_IWebBrowser2,(PVOID *)&spIE);
  
  hr = spIE->put_Visible(VARIANT_TRUE);
  hr = spIE->GoHome();
  
  return 1;  // Let the system set the focus
}

6. CAxWindow m_IEHost; 를 .h 에 추가하세요.
7. _tWinMain 부분을 다음과 같이 고치세요.
    if (bRun)
    {
      _Module.StartMonitor();
#if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
      hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, 
        REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED);
      _ASSERTE(SUCCEEDED(hRes));
      hRes = CoResumeClassObjects();
#else
      hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, 
        REGCLS_MULTIPLEUSE);
#endif
      _ASSERTE(SUCCEEDED(hRes));
      
      C????Dlg dlg;
      
      dlg.DoModal();
      
      /*        MSG msg;
      while (GetMessage(&msg, 0, 0, 0))
      DispatchMessage(&msg);*/
      
      _Module.RevokeClassObjects();
      Sleep(dwPause); //wait for any threads to finish
    }
8. 컴파일 하면 dlg 가 뜨고, 초기 홈페이지를 Load 합니다.

더 자세한 것은 또 문의 하세요... (될수 있으면 E-Mail 은 피해 주세요)

[출처 : 데브피아 EDIT 


posted by 유돌이
prev 1 next