動态鍊接庫DLL文件不僅可以實現代碼、資源和數據的共享,同時也可以對源代碼起保護作用,對于開發者來講,DLL的生成及調試是程序員必須掌握的一種技術,下面通過一個具體的例子,演示使用C/C 語言生成及調用DLL文件的方法。這兒開發工具選擇的是小巧玲珑、啟動迅速、精典一代的VC6.0環境,開發完成的目錄結構如下圖所示:
從目錄結構中可以看出,這個例子在“E”盤的“MyDllCode”文件夾下創建了一個工作空間“MyDllCode.dsw”,工作空間中包含了兩個項目,分别對應文件夾“MyDllSrc”和“MyDllTest”,其中, 前者是動态庫的源代碼工程,後者是測試代碼(調試代碼)工程,另外兩個文件夾“Debug”和“Release”存放了生成的dll和exe文件。
下面依次詳細說明動态庫的創建及調試過程。
創建工作空間和項目在VC6.0中,選擇菜單“文件”-->“新建...”,在彈出的對話框中切換到“工作區”選項頁,依次填寫工作空間名稱和位置信息,如下圖所示:
工作區創建完成後,在VC6.0的左邊控制面闆上的“FileView”中顯示當前的工作區名稱為“MyDllCode”,包含的項目個數為0,在工作區上點右鍵,彈出的右鍵菜單中選擇“添加新工程到工作空間...”,如下圖所示:
在彈出的新建工程對話框中,選擇工程類型為“Win32 Dynamic-Link Library”,工程名稱為“MyDllSrc”,切記選中“添加到當前工作空間”,設置如下圖所示:
在彈出的動态庫配置對話框中,選擇動态庫類型為“一個空的DLL工程”即可,如下圖所示,這樣就完成了動态庫源代碼工程的創建。
同樣的步驟,可以在工作空間中創建一個空的測試代碼工程,與動态庫源代碼工程不同的是,工程類型選擇“Win32 Console Appliction”的控制台程序,工程名稱為“MyDllTest”。
工作空間的工程項目創建完成後,在VC6.0的左邊控制面闆上的“FileView”中顯示情況如下圖所示,此時包含2個工程項目,皆為空工程,未包含任何源代碼文件:
設置工程輸出目錄
本例子既包含了動态庫源代碼工程,也包含了測試代碼工程(即調試工程),為便于調試,将兩個工程的輸出文件目錄設為同一個目錄,如都設為與工作空間“MyDllCode.dsw”同一個目錄,這樣免去了将動态庫dll文件手動拷到exe所在的目錄下的麻煩。如對于“Debug”模式,在VC6.0中選擇菜單“工程”-->“設置”或直接按“Alt F7”快捷鍵,在彈出的工程對話框中選中工程“MyDllSrc”,在右側的“連接”選項卡頁修改輸出文件名,由原來默認的“Debug/MyDllSrc.dll”修改為“../Debug/MyDll.dll”,即将生成的“MyDll.dll”文件修改為當前工程所在目錄的上級目錄的“Debug”文件夾中。同樣方式修改工程“MyDllTest”文件輸出目錄為“../Debug/MyDllTest.exe”如下圖所示:
對于“Release”模式,同上面方式完全相同,分别将工程“MyDllSrc”和“MyDllTest”的文件輸出目錄修改為“../Release/MyDll.dll”和“../Release/MyDllTest.exe”。
編寫動态庫工程源代碼文件新建頭文件“MyDll.h”,在VC6.0中選擇菜單“文件”-->“新建...”,在彈出的新建文件對話框中設置如下圖所示,切記勾選“添加到工程”為“MyDllSrc”。
在新建的“MyDll.h”文件中,代碼如下:
同樣的方式,新建C 源文件“MyDll.cpp”,代碼如下:
在動态庫工程中,定義并導出了一個函數“MyFunc”,該函數産生等間隔的數據向量并返回數據向量的最後一個值和狀态信息。在頭文件中定義宏“EXPORT”為“extern "C" __declspec(dllexport)”,說明該函數調用約定為“C”方式,在其它編程語言中調用該函數時,調用約定必須一緻。編譯運行後即可得到在“E:\MyDllCode\Debug”目錄下得到動态庫文件“MyDll.dll”。
編寫測試工程(調試工程)源代碼文件同編寫動态庫源代碼文件類似,新建一個測試代碼C 源文件“main.cpp”,切記勾選“添加到工程”為“MyDllTest”,代碼如下:
代碼中,通過“#include "../MyDllSrc/MyDll.h"”引入動态庫的頭文件,通過#pragma宏引入lib文件,這兒注意,路徑必須設置正确。編譯運行後即可得到在“E:\MyDllCode\Debug”目錄下得到可執行程序“MyDllTest.exe”文件,運行結果如下:
可見,調試代碼工程中,已經正确調用了“MyFunc”函數。
結論上面給出了在VC6.0中創建及調試動态庫的完整過程,在其它如VS2008、VS2010等IDE中,配置環節也是類似的。另外,需要說明的是,由于本例子将動态庫工程和調試工程放在了同一個工作空間中,因此,在單步調試中,若在調用函數的行設置斷點,則不需作額外的設置,會自動進入到動态庫工程的源代碼“MyDll.cpp”中,觀察“MyFunc”函數的執行情況。
加關注,私信回複:“C008”,可獲取VC6.0環境的工程源碼。
歡迎加關注,共同交流。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!