2012-02-10 89 views
3

我已經多次被告知我應該考慮將應用程序的各個部分拆分爲單獨的DLL(以加速鏈接等),並試圖弄清楚作品。如何將C++ Builder應用程序拆分爲DLL

據我所知,我需要將__declspec(dllexport)添加到我打算使用的每個頭文件聲明中。這似乎很乏味,但它是可行的。

如何獲取應用程序+ DLL運行?在一個簡單的測試項目中,我發現的唯一方法是將DLL項目的構建輸出目錄中的DLL手動複製到exe項目的構建輸出目錄中。我知道我可以設置一個構建後步驟來完成這個任務,但是我希望IDE有一些方法可以讓應用程序項目在同一個項目組中的一部分時使用DLL項目自動化。

如何調試應用程序+ DLL?我在Project - > Options - > Debugger下看到了我可以在哪裏指定DLL的主機應用程序,但到目前爲止,我只能弄清楚如何一次調試一個項目。我真的希望能夠在代碼庫中的任何地方設置斷點,並且能夠在代碼庫中的任何位置單步設置斷點(而不是停在項目邊界),而且我無法弄清楚如何實現這一點。

回答

3

據我所知,我需要添加__declspec(dllexport)到每個標頭 我打算使用的文件聲明。這似乎很乏味,但它是 可行。

你應該做的是建立在你的DLL的頭文件中的#define映射時,報頭由DLL項目編譯DLLEXPORT和地圖在其他項目編制時的DllImport。例如:

#ifndef MyDLLH 
#define MyDLLH 

#ifdef _BUILDING_DLL_ 
#define MY_EXPORT __declspec(dllexport) 
#else 
#define MY_EXPORT __declspec(dllimport) 
#endif 

#ifdef __cplusplus 
extern "C" { 
#endif 

MY_EXPORT type callingconvention SomeFunc(parameters); 
#ifdef __cplusplus 
} 
#endif 

#endif 

然後你就可以在你的只有DLL項目定義_BUILDING_DLL_,無論是在項目選項的條件語句列表,或在你的代碼上面的頭文件中的任何#include語句,如:

#define _BUILDING_DLL_ 
#include "MyDll.h" 

如何獲取應用程序+ DLL運行?

DLL項目生成一個.lib文件,用於靜態鏈接到DLL的導出函數。您可以將.lib文件添加到您的EXE項目中,然後像調用其他任何函數一樣調用DLL函數。或者,您可以使用Win32 API LoadLibrary()和GetProcAddress()函數在運行時動態加載DLL函數,在這種情況下,根本不使用.lib文件。

在一個簡單的測試項目中,我發現的唯一方式的工作原理是 從DLL項目的構建輸出目錄下的DLL手動複製到 的exe項目的構建輸出目錄。

EXE文件夾是操作系統查找DLL的第一個位置,但它不是操作系統可以查看的唯一位置。MSDN文檔如何DLL被定位在運行時:

Dynamic-Link Library Search Order

我知道我可以設置生成後步驟來做到這一點,但是我希望在 IDE有一些方法來自動化其當一個應用程序項目屬於同一個項目組時,應用程序項目會使用DLL項目 。

只是作爲同一項目組的一部分是不夠的。這些項目是獨立編譯的。但是,您可以設置DLL項目爲EXE項目的扶養(或只需確保DLL projct是構建順序那麼EXE項目上上漲),因此DLL首先編譯,然後使用DLL的PostBuild事件移動編譯後的.lib和.dll二進制文件,最後將DLL的編譯後的.lib文件添加到EXE項目中,以便在運行時使用該DLL。

如何調試應用程序的DLL +?

你有兩個選擇:

要單獨調試只是DLL,DLL項目加載到IDE中,進入運行參數,並設置編譯EXE在主機應用程序。然後,您可以像運行EXE項目一樣運行DLL項目。 EXE將被執行,並且一旦將DLL加載到內存中,調試器就會連接到DLL。

要在同一時間調試這兩個項目中,EXE項目加載到IDE替代,並確保該DLL的源文件夾中的項目選項的調試周守軍指定路徑。然後,您可以正常運行的EXE工程,DLL的源步入DLL函數被調用時,設置斷點等

+1

,我發現必須在同一時間調試這兩個項目一個額外的步驟:複製' .tds'文件(調試器符號)從DLL輸出目錄移動到「.dll」文件將駐留在應用程序的任何位置。 – 2012-02-10 19:48:30

+0

@喬什 - 凱利:我已經能夠不復制,如果我設置了'.exe'項目的「工作目錄」包含了'.dll'和'.tds'文件的路徑,可以同時調試。在C++ Builder XE下,在「項目選項」>「調試器」下找到「工作目錄」選項。 – Pete 2013-03-19 17:30:31