본문 바로가기
프로그래밍

Launcher 만들기

by 알 수 없는 사용자 2012. 3. 22.
음....

프로그램을 배포할때
exe 하나의 파일로 배포하고 싶은 경우가 있다.

왜부 dll을 사용하는데 Import-Lib로 링크한 경우라면 dll 을 exe에 포함할수 없어
따로 배포해 줘야한다.


위와같은 경우 
Launcher 프로그램을 만들고
Launcher의 리소스에 dll과 실제 실행할 exe등을 포함시켜서 배포하고

Launcher가 실행될때 리소스에 있는 dll 이나 exe등을 file로 만들고 실행시켜주면 된다.

C++Builder2010으로 만든 샘플 프로그램..

다음 코드는 볼포에 김태선님이 올린 소스를 참고하여서 작성했습니다.
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=1004 


/*
// ***.rc 파일에는 다음과 같이 리소스에 포함하고 싶은 파일을 작성한다.

WJ_PANTO_INSP EXE "WJ_PANTO_INSP.EXE"
XVision140 BPL "XVision140.bpl"

*/

bool __fastcall SaveFileFromResource(wchar_t *Resname, wchar_t *ResType, wchar_t *SaveFName)
{
    TResourceStream *ResSt;
    try
    {
          ResSt = new TResourceStream((int)HInstance, Resname, ResType); 
          ResSt->SaveToFile(SaveFName); 
          return true; 
    }
    __finally
    {
          delete ResSt; 
    }
}
//---------------------------------------------------------------------------
void __fastcall RunResourceExe()
{
    String sPath=ExtractFilePath(ParamStr(0));
    SetCurrentDirectoryW(sPath.c_str());
    SaveFileFromResource(L"XVision140", L"BPL", L"XVision140.BPL");
    if(SaveFileFromResource(L"WJ_PANTO_INSP", L"EXE", L"WJ_PANTO_INSP.EXE"))
    {
           AnsiString sExeFname=sPath+"WJ_PANTO_INSP.EXE"; 
           AnsiString sBplFname=sPath+"XVision140.BPL"; 
           if(FileExists(sExeFname)) 
          {
                 PROCESS_INFORMATION pinfo;  
                STARTUPINFO start;     
                memset(&start, 0, sizeof(STARTUPINFO)); 
                start.cb = sizeof(start); 
                start.wShowWindow = SW_SHOWDEFAULT; 
                SECURITY_ATTRIBUTES sec; 
                sec.nLength = sizeof(sec); 
                sec.lpSecurityDescriptor = NULL; 
                sec.bInheritHandle = TRUE; 
                if(CreateProcessA(sExeFname.c_str(), NULL, &sec, &sec, TRUE,0, NULL, NULL, &start, &pinfo) !=    
 TRUE)
                
                      ShowMessage(AnsiString("CreateProcess() failed: ") + GetLastError()); 
                      return; 
                
                else 
                
                       //실행한 process가 종료될때까지 기다린다. 
                      WaitForSingleObject(pinfo.hProcess,INFINITE); 

                      //process가 종료되면 만들었던 file을 삭제한다. 
                      DeleteFileA(sExeFname); 
                      DeleteFileA(sBplFname); 
                
          
    }
}

//---------------------------------------------------------------------------
WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{

    try
    {
          Application->Initialize(); 
          RunResourceExe(); 
          return 0; 
    }
    catch (Exception &exception)
    {
          Application->ShowException(&exception); 
    }
    catch (...)
    {
          try 
          
                 throw  Exception(""); 
          
          catch (Exception &exception) 
          
                Application->ShowException(&exception); 
          
    }
    return 0;
}
//---------------------------------------------------------------------------