프로그래밍

InstallShield 7.0에서 IE창 닫은후 프로그램 제거하기

채윤아빠 2007. 12. 22. 00:04
728x90
반응형

프로그램을 개발하던 중에, IE를 모두 닫은 후에 프로그램을 제거해야만 하는 경우가 있었습니다.
이런 경우 InstallShield 프로그램에서 다음과 같이 처리하면 IE를 모두 닫고 제거를 수행하도록 할 수 있습니다.
아래의 코드를 OnMaintUIBefore에 적당히 넣으시면 됩니다.

    STRING svResult, szCaption, szAppPath;
    NUMBER nResult, nRetry;
    HWND nhWnd, nHwnd;

    ....

    svResult = @PRODUCT_NAME+"를 시스템에서 제거합니다. 계속 하시겠습니까?";
    szCaption = @PRODUCT_NAME+" 제거";
    nResult = SprintfBox(MB_YESNO|MB_ICONQUESTION, szCaption, "%s", svResult);
 if (nResult = IDNO) then
     exit; // "아니오" 버튼을 선택한 경우, 제거하지 않는다.
 elseif(nResult = IDYES) then
  nhWnd = FindWindow(IE_CLASS_NAME, "");
  if( NULL != nhWnd) then
      svResult = @PRODUCT_NAME2+"를 시스템에서 제거하기 위해서는 먼저 익스플로러를 종료해야 합니다.\n\r모든 익스플로러창을 닫으시겠습니까?";
      szCaption = "익스플로러 동작 확인";
      nResult = SprintfBox(MB_YESNO|MB_ICONQUESTION, szCaption, "%s", svResult);
   if(nResult = IDYES) then
    nRetry = 0;
Loop:
    nRetry++;
    //예 버튼을 눌렀을 경우에 익스플로러 를 종료한다.
    nHwnd = FindWindow (IE_CLASS_NAME, "");
    if( nHwnd!=NULL ) then
     SendMessage (nHwnd, WM_SYSCOMMAND, SC_CLOSE, 0);
     if nRetry<1000 then // 1000회까지만, 닫기 시도를 한다.
      goto Loop; //종료 후 다시한번 반복하여 다시한번 종료한다.
     endif;
    endif;
    if (nRetry=1000) then
        svResult = "익스플로러를 종료하는데 실패하였습니다.\r\n모든 익스플로러창을 닫고 다시 시도해 주십시오.";
        szCaption = @PRODUCT_NAME+" 제거 실패";
        nResult = SprintfBox(WARNING, szCaption, "%s", svResult);
     exit;
    endif;
   elseif (nResult = IDNO) then
       svResult = @PRODUCT_NAME+"를 시스템에서 제거하기 위해서는 먼저 익스플로러를 종료해야 합니다.";
       szCaption = @PRODUCT_NAME+" 제거 실패";
       nResult = SprintfBox(INFORMATION, szCaption, "%s", svResult);
    exit;
   endif;
  endif;

     // setup default status
        SetStatusWindow(0, "");
        Enable(STATUSEX);
        StatusUpdate(ON, 100);
                            
        szCaption = TARGETDIR;                            

        // 설치한 모든 파일들을 삭제한다.
        ComponentRemoveAll();