




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CECS 10137-2021建筑光伏控制及變配電設(shè)備技術(shù)要求
- T/CECS 10130-2021預(yù)制混凝土構(gòu)件工廠質(zhì)量保證能力要求
- T/CECS 10123-2021低溫輻射碳棒發(fā)熱軌
- T/CCS 030-2023采煤機智能調(diào)高與軌跡規(guī)劃技術(shù)規(guī)范
- T/CCASC 3002-2023聚氯乙烯動態(tài)熱穩(wěn)定性試驗雙輥開煉機塑煉法
- T/CCAS 038-2024水泥行業(yè)5G智能安全帽
- T/CAS 851-2024氫氣輸送工業(yè)管道技術(shù)規(guī)程
- T/CAQI 41-2018直飲水水站安裝驗收要求
- 大一c語言考試題及答案
- 畫圖教程考試題及答案
- 基于PLC的藥房取藥系統(tǒng)設(shè)計
- 2023年南方科技大學(xué)機試樣題練習(xí)
- GB/T 24282-2021塑料聚丙烯中二甲苯可溶物含量的測定
- GB/T 16447-2004煙草及煙草制品調(diào)節(jié)和測試的大氣環(huán)境
- 講義配電房可視化管理標(biāo)準(zhǔn)課件
- 建筑大師伊東豐雄簡介及作品集課件
- 《新疆精河縣烏蘭達(dá)坂脈石英礦資源儲量核實報告》礦產(chǎn)資源儲量
- 管理學(xué)原理第六章 指揮課件
- 工序標(biāo)準(zhǔn)工時及產(chǎn)能計算表
- 2023年最新的馬季吹牛相聲臺詞
- 幼兒園大班數(shù)學(xué)口算練習(xí)題可打印
評論
0/150
提交評論