음....
프로그램을 배포할때
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
프로그램을 배포할때
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; } //--------------------------------------------------------------------------- |
'프로그래밍' 카테고리의 다른 글
Block PrintScreen ( 프로그램 캡쳐 방지) (0) | 2012.03.23 |
---|---|
LOG_PRINTF 문자열 길이 제한을 벗어버리자 (0) | 2012.03.22 |
TPageControl 사용법 설명 (0) | 2012.02.07 |
C++빌더 2010에서 Build Event 사용하기 (0) | 2010.12.07 |
C++builder 2010 Class Explorer (0) | 2010.03.02 |