웹, HTML

CreateProcess로 인터넷익스플로러 실행하고 당해 웹브라우저 컨트롤 얻기....

디버그정 2009. 7. 4. 17:49

// 그냥 무식하게 실행후 일정시간동안 EnumWindows 등으로 뒤지던가
// FindWindow로 캡션과 클래스명을 이용하여 찾는 방법도 있겟으나,
// 윈도우 명과 클래스 명이 같은 경우 엉뚱한 것을 찾을 수 있다.

// 다음과 같이 쉘원도우즈 인터페이스를 이용하여 웹브라우져 컨트롤 인터페이스를 구한후
// GetWindowThreadProcessId를 통해 구해진 값과 CreateProcess실행시의 pid값을 비교하여 찾을 수 있다.
// 깔끔한 SDK 소스~~~


#define _WIN32_DCOM

#include <windows.h>
#include <tchar.h>

#include <atlbase.h>             // 이하 5줄은 ATL, COM 관련 헤더화일들 및 전역 객체
extern CComModule _Module;       // _Module이름을 바꾸면 안 됨
#include <atlcom.h>
#include <atlhost.h>
CComModule _Module;

HINSTANCE g_hInst;


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpcmdLine, int nShowCmd)
{
 CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

 g_hInst = hInstance;
 TCHAR szCmd[]=_T("C:\\Program Files\\Internet Explorer\\iexplore.exe http://movie.naver.com/");
 STARTUPINFO si={0};
 PROCESS_INFORMATION pi={0};
 BOOL bRes=CreateProcess(NULL, szCmd, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
 if(bRes==FALSE) goto FinishingPoint;
 
 Sleep(1000); // 슬립을 주지 않으면 생성되기 전에 먼저 아래 코드가 빨리 지나가버린다.

 {
  IShellWindows *pShellWindows=NULL;
  IWebBrowser2 *pWebBrowser=NULL;
  IDispatch *pDisp=NULL;
  HWND hWnd=NULL;
  long i, lCount=0;

  VARIANT varIndex;
  varIndex.vt=VT_I4; // 4바이트 롱형
  DWORD pid;
  BOOL bSuc=FALSE;

  if(S_OK == CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL,
         IID_IShellWindows, (void**)&pShellWindows)){
   if(S_OK == pShellWindows->get_Count(&lCount)){
    for(i=0 ; i<lCount ; i++){
     varIndex.lVal=i;
     if(S_OK == pShellWindows->Item(varIndex, &pDisp)){
      if(S_OK == pDisp->QueryInterface(IID_IWebBrowser2, (void**)&pWebBrowser)){
       if(S_OK == pWebBrowser->get_HWND((long*)&hWnd)){
        if(GetWindowThreadProcessId(hWnd, &pid)){
         if(pid == pi.dwProcessId){
          bSuc = 1;
          MessageBoxA(hWnd, "Good job!!!", "success", MB_OK);
          pDisp->Release();
          break;
         }
        }
       }
       pWebBrowser->Release();
      }
      pDisp->Release();
     }
    }
   }
   pShellWindows->Release();
  }
 
  if(bSuc){
   TCHAR szStr[256]={0};
   wsprintf(szStr, _T("타겟 인터넷익스플로러의 핸들은 0X%08X입니다."), hWnd);
   MessageBox(hWnd, szStr, _T("성공"), MB_OK);

   VARIANT varUrl, varEmpty;
   varUrl.vt=VT_BSTR, varEmpty.vt=VT_EMPTY;;
   BSTR bstrUrl=SysAllocString(L"http://www.google.co.kr");
   varUrl.bstrVal=bstrUrl;
   pWebBrowser->Navigate2(&varUrl, &varEmpty, &varEmpty, &varEmpty, &varEmpty);
   SysFreeString(bstrUrl);
   pWebBrowser->Release();
  } else {
   MessageBoxA(NULL, "찾지 못했습니다.", "실패", MB_OK);
  }

 }

FinishingPoint:
 CoUninitialize();
 return 0;
}