CBuilder建立及調(diào)用DLL_第1頁
CBuilder建立及調(diào)用DLL_第2頁
CBuilder建立及調(diào)用DLL_第3頁
CBuilder建立及調(diào)用DLL_第4頁
CBuilder建立及調(diào)用DLL_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、C+Builder建立及調(diào)用DLLDLL簡稱動態(tài)鏈接庫,是Windows中程序的重要組成部分。想象一下,一個程序需要多人共同完成開發(fā),怎么個共同法?這時我們就要考慮把程序分為好幾個模塊,團隊每一個成員開發(fā)一個模塊。問題來了:如何將模塊組合并成一個完整系統(tǒng)?還有,我們開發(fā)的軟件需要不斷升級,如何升級?難道每次非得把整個工程重新編譯一次再發(fā)布給用戶嗎?解決這些問題的科學(xué)辦法,就是開發(fā)動態(tài)鏈接庫DLL?,F(xiàn)在以開發(fā)myDLL.dll動態(tài)鏈接庫為例,講講BCB中開發(fā)動態(tài)鏈接庫的方法。1、新建立一個工程:File-New-Other.在New卡中選擇DLL Wizard2、將工程存為myDLL.bpr3、

2、在myDLL.cpp中寫接口代碼:/-#include <vcl.h>#include <windows.h>#pragma hdrstop/-/   Important note about DLL memory management when your DLL uses the/   static version of the RunTime Library:/   If your DLL exports any functions that pass String objects (or structs/

3、   classes containing nested Strings) as parameter or function results,/   you will need to add the library MEMMGR.LIB to both the DLL project and/   any other projects that use the DLL. You will also need to use MEMMGR.LIB/   if any other projects which use t

4、he DLL will be performing new or delete/   operations on any non-TObject-derived classes which are exported from the/   DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling/   EXE's to use the BORLNDMM.DLL as their memory manager. In these case

5、s,/   the file BORLNDMM.DLL should be deployed along with your DLL./   To avoid using BORLNDMM.DLL, pass string information using "char *" or/   ShortString parameters./   If your DLL uses the dynamic version of the RTL, you do not need to/ 

6、0; explicitly add MEMMGR.LIB as this will be done implicitly for you/-extern "C" _declspec(dllexport) _stdcall int myAdd(int,int);extern "C" _declspec(dllexport) _stdcall AnsiString aboutMe(void);int add(int n1,int n2);#pragma argsusedint WINAPI DllEntryPoint(HINSTANCE hinst, uns

7、igned long reason, void* lpReserved)        return 1;/-_declspec(dllexport) _stdcall int myAdd(int n1,int n2)int T;T=add(n1,n2);return T;int add(int n1,int n2)return n1+n2;_declspec(dllexport) _stdcall AnsiString aboutMe(void)return "曾棕根好你個大笨蛋,居然現(xiàn)在才學(xué)會用DLL!半年前施

8、勇強就告訴了你呀!研究進度太慢!"4、需要注意的是,在編寫DLL這樣的程序時,要力求簡單,少用大量內(nèi)存分配,盡量按照標(biāo)準(zhǔn)C的程序設(shè)計方法,以模塊化結(jié)構(gòu)設(shè)計為好,少采用面向?qū)ο蟮某绦蛟O(shè)計方法。5、進入Project-Options:      勾掉Linker頁中的Use Dynamic RTL      勾掉Packages頁中的Build with runtime packages      按一次Compiler中的Release按

9、鈕      在Version Info頁中勾選Include version information in project,并勾選Auto-increment build number,再在里面設(shè)置好版權(quán)信息6、現(xiàn)在可以進入Project-Build myDLL生成myDLL.dll和myDLL.lib這兩個文件。二 靜態(tài)調(diào)用動態(tài)鏈接庫DLL調(diào)用DLL有兩種方式,一種是靜態(tài)調(diào)用,另一種就是動態(tài)調(diào)用。靜態(tài)調(diào)用需要LIB庫文件和DLL文件,程序編譯時,需要用到LIB文件,發(fā)布時這個LIB文件就不再需要,而且,編譯系統(tǒng)時,這個動態(tài)鏈接庫已編譯進程序

10、,這樣,在程序一開始運行時就會查找這個DLL文件,如果這個DLL文件不存在,那么,程序是啟動不起來的。相反,動態(tài)調(diào)用DLL則不是這樣,它只需要DLL文件,程序運行時,程序不需要知道這個DLL文件當(dāng)前是否存在,只有當(dāng)程序運行到某個點,才需要去調(diào)用DLL文件多個應(yīng)用程序調(diào)用DLL時,DLL 在內(nèi)存中只產(chǎn)生一個實例,因此,可以有效地節(jié)省內(nèi)存空間,提高系統(tǒng)的運行效率。注意到,DLL 的編制與編程語言無關(guān),只要遵守DLL的接口規(guī)范,許多語言都可以開發(fā)出高效的DLL程序,其它語言開發(fā)的DLL,同樣可以在BCB中調(diào)用。下面介紹以myDLL.dll為例靜態(tài)調(diào)用DLL的步驟:1、將myDLL.dll和myDLL

11、.lib文件拷入到開發(fā)工程中,注意到,應(yīng)用程序發(fā)布時,這個lib文件是不需要的。如果是其它語言開發(fā)的DLL,在沒有l(wèi)ib文件的情況下,可以用implib.exe工具程序,生成一個lib文件,用法:implib.exe 文件名.lib 文件名.DLL2、Project-Add to project將myDLL.lib庫導(dǎo)入到工程。如果要從工程中清除庫文件,方法有兩種:a、Project-Remove from projectb、View-Project Manager3、在工程的Unit1.cpp中寫程序代碼:/-#include <vcl.h>#pragma hdrstop#inc

12、lude "Unit1.h"/-#pragma package(smart_init)#pragma resource "*.dfm"TForm1 *Form1;extern "C" _declspec(dllimport) _stdcall int myAdd(int,int);extern "C" _declspec(dllimport) _stdcall AnsiString aboutMe(void);/-_fastcall TForm1:TForm1(TComponent* Owner) 

13、60;      : TForm(Owner)/-void _fastcall TForm1:Button1Click(TObject *Sender)   int n;   n=myAdd(1,2);   ShowMessage(IntToStr(n);/-void _fastcall TForm1:Button2Click(TObject *Sender)ShowMessage(aboutMe();       

14、 /-三 動態(tài)調(diào)用動態(tài)鏈接庫DLL動態(tài)調(diào)用DLL函數(shù)可分為八步:第一步:函數(shù)定義。這里的函數(shù)為地址轉(zhuǎn)換函數(shù)。下面這個函數(shù)其實就是定義 int _stdcall myAdd(int,int);   int _stdcall (*myAdd)(int,int);第二步:定義模塊句柄,全局變量,它是載入DLL文件后的實例   HINSTANCE HmyDLL;第三步:裝入DLL文件,同時獲得它的句柄HmyDLL=LoadLibrary("myDLL.dll");第四步:定義函數(shù)地址變量   FARPROC P;第五步:獲

15、取動態(tài)鏈接庫內(nèi)的某一函數(shù)的內(nèi)存地址     P=GetProcAddress(HmyDLL,"myAdd");第六步:強制類型轉(zhuǎn)換,即將所獲取的函數(shù)地址強制轉(zhuǎn)換為函數(shù)       myAdd=(int _stdcall (_cdecl *)(int,int)P;第七步:函數(shù)調(diào)用       n=myAdd(10,20);第八步:釋放DLLFreeLibrary(HmyDLL);下面以動態(tài)調(diào)用myDLL.dll函數(shù)為例

16、,進行講解:/-#include <vcl.h>#pragma hdrstop#include "Unit1.h"/-#pragma package(smart_init)#pragma resource "*.dfm"TForm1 *Form1;/第一步:函數(shù)定義。這里的函數(shù)為地址轉(zhuǎn)換函數(shù)。下面這個函數(shù)其實就是定義 int _stdcall myAdd(int,int);int _stdcall (*myAdd)(int,int);AnsiString _stdcall (*aboutMe)(void);/第二步:定義模塊句柄,全局變量,它

17、是載入DLL文件后的實例HINSTANCE HmyDLL;/-_fastcall TForm1:TForm1(TComponent* Owner)        : TForm(Owner)/第三步:裝入DLL文件,同時獲得它的句柄HmyDLL=LoadLibrary("myDLL.dll");/-void _fastcall TForm1:Button1Click(TObject *Sender)   int n;   /第四步:定義函數(shù)地址變量 

18、60; FARPROC P;   if(HmyDLL!=NULL)        /第五步:獲取動態(tài)鏈接庫內(nèi)的某一函數(shù)的內(nèi)存地址     P=GetProcAddress(HmyDLL,"myAdd");     if(P=NULL)            ShowMessage("打開myAdd()函數(shù)錯誤

19、!");          else            /第六步:強制類型轉(zhuǎn)換,即將所獲取的函數(shù)地址強制轉(zhuǎn)換為函數(shù)       myAdd=(int _stdcall (_cdecl *)(int,int)P;       /第七步:函數(shù)調(diào)用   

20、0;   n=myAdd(10,20);       ShowMessage(IntToStr(n);           else        ShowMessage("打開動態(tài)鏈接庫文件myDLL.dll錯誤!");   /-void _fastcall TForm1:FormDestroy(TObject *Sender)/第八步:釋放DLLFreeLibrary(HmyD

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論