在開發獨立部署的應用程式時,將圖示、游標、聲音、動畫甚至外部執行檔(如解壓縮工具)直接嵌入 EXE 內,可簡化發行流程。C++Builder 透過 .rc 資源定義檔 配合資源編譯器(BRCC32)實現此需求。
格式為:資源識別名 資源類型 檔案路徑。範例:
S1 WAV wav1.wav
C1 CURSOR cursor1.cur
I1 ICON icon1.ico
unzip EXEFILE pkunzip.exe
將 .rc 加入專案,或以命令列編譯:brcc32 src1.rc src1.res 生成 .res 二進位資源檔。
圖示、游標、加速鍵表、位圖、選單、字串表等,皆可用對應 API 載入:LoadIcon、LoadCursor、LoadBitmap… 參數為模組實例句柄與資源識別名。
// 更換游標與應用程式圖示
Screen->Cursors[crDefault] = LoadCursor(HInstance, "C1");
Icon = new TIcon();
Icon->Handle = LoadIcon(HInstance, "I1");
Application->Icon = Icon;
須依序呼叫 FindResource → LoadResource → LockResource 取得記憶體指標,再配合 sndPlaySound(加 SND_MEMORY 旗標)播放嵌入的 WAV。
HRSRC h = FindResource(HInstance, "S1", "WAV");
HGLOBAL h1 = LoadResource(HInstance, h);
char *wav_handle = (char*)LockResource(h1);
sndPlaySound(wav_handle, SND_MEMORY | SND_SYNC);
採用「釋放到暫存目錄 → 執行 → 可選刪除」策略。利用 TResourceStream 讀取資源並存檔,再以 ShellExecute 啟動。
TResourceStream *rs = new TResourceStream((int)HInstance, "unzip", "EXEFILE");
rs->SaveToFile(tmpPath + "\\pkunzip.exe");
delete rs;
ShellExecute(Handle, "open", "pkunzip.exe", params, tmpPath, SW_HIDE);
此法以時空換便利性,適合將大型附屬檔案內嵌於主程式,發佈時僅需單一 EXE。