ref
BCB:Put DLL File into EXE File
把 DLL File 存放於應用程式裡,在應用程式是很常用的技巧,這個方法可以讓程式設計者只需給使用者一個執行檔就可以,不需再給DLL File。就不需要擔心使用者忘了把應用程式 和 DLL File 放在同一個目錄之下。有些程式設計者會使用InstallShield 把應用程式和DLL整合在一起來解決這個問題,而我們是把DLL放到執行檔的資源裡。
在PE格式的執行檔包含了資源,CODE 和 DATA,其中資源可以是文字(EX:版權宣告),圖片,ICON,動畫及二進制檔,我們就是把 DLL FILE 或者 DRIVER 宣告成二進制檔放到執行檔的資源中。
1.下載免費軟體 ResEdit
1-1. 開啟 ResEdit 選擇 File-> New project -> Resource Script File Name (.RC)
1-2. 在 Resources 欄位中,選擇 Add Resources ... -> User Defined -> Name identifier -> 輸入 RCDATA -> 選擇你的 DLL File.
1-3. 選擇檔案儲存,一共會有二個檔案,一個為 Resource.h 及 .RC FILE。
2. 打開 BCB 並開啟你的專案,選擇 View/Project Manager 開啟Project Manager DIALOG,將 .RC File 加入到你的專案中
在 Unit1.cpp 中,加入以下的程式碼
在PE格式的執行檔包含了資源,CODE 和 DATA,其中資源可以是文字(EX:版權宣告),圖片,ICON,動畫及二進制檔,我們就是把 DLL FILE 或者 DRIVER 宣告成二進制檔放到執行檔的資源中。
1.下載免費軟體 ResEdit
1-1. 開啟 ResEdit 選擇 File-> New project -> Resource Script File Name (.RC)
1-2. 在 Resources 欄位中,選擇 Add Resources ... -> User Defined -> Name identifier -> 輸入 RCDATA -> 選擇你的 DLL File.
1-3. 選擇檔案儲存,一共會有二個檔案,一個為 Resource.h 及 .RC FILE。
2. 打開 BCB 並開啟你的專案,選擇 View/Project Manager 開啟Project Manager DIALOG,將 .RC File 加入到你的專案中
在 Unit1.cpp 中,加入以下的程式碼
#include "resource.h" typedef int (*GETNAME)(void); // DLL Function Name void __fastcall TForm1::Button2Click(TObject *Sender) { HINSTANCE hinstApp; hinstApp=LoadLibrary(ExtractFileName(Application->ExeName).c_str()); if(hinstApp!=NULL) { TResourceStream *rcStream=new TResourceStream ((int)hinstApp,IDR_RCDATA1, RT_RCDATA); rcStream->SaveToFile("Naming.dll"); HINSTANCE hinstDll; hinstDll=LoadLibrary("Naming.dll"); if(hinstDll!=NULL) { GETNAME getName; int NameId=0; getName=(GETNAME)GetProcAddress(hinstDll,"_getName"); if(getName!=NULL) { NameId=getName(); ShowMessage(IntToStr(NameId)); } FreeLibrary(hinstDll); } delete rcStream; FreeLibrary(hinstApp); } }