動態鏈結庫(dll)是windows程式設計常遇到的程式設計方法,下面我就介紹一下在bcb (c++ builder下簡稱bcb) 中如何建立使用dll和一些技巧。
一、建立:
使用bcb file|new建立乙個新的dll工程,並儲存好檔案bcb,生成乙個dll的程式框架。
1.dllentrypoint函式為乙個入口方法,如果使用者在dll被系統初始化或者登出時被呼叫,用來寫入對dll的初始化程式和解除安裝程式;引數:hinst用來指示dll的基位址;reason用來指示dll的呼叫方式,用於區別多執行緒單執行緒對dll的呼叫、建立、解除安裝dll;
2.在程式中加入自己所要建立的dll過程、函式;
3.用dllimport描述出口;
例程式如下:
#include
#pragma hdrstop
extern "c" __declspec(dllexport) int test();
int winapi dllentrypoint(hinstance hinst, unsigned long reason,void *)
int test()
注意:動態鏈結庫中呼叫過程、函式時有不同的call方式 __cdecl、__pascal, __fastcall、__stdcall,bcb中預設的方式為__cdecl(可不寫),如果考慮相容性可用時__stdcall宣告方法為:
extern "c" __declspec(dllexport) int __stdcall test();
對於其中過程、函式也改為:
int __stdcall test()
二、使用dll
在bcb中使用dll有兩種方法:
1.用靜態呼叫法
首先需要在bcb的專案中加入輸入介面庫(import library),開啟工程專案,使用bcb view|project manager開啟專案列表,向專案中加入介面庫(*.lib)。
其次在標頭檔案中加入介面宣告。
例程式如下:
//define in include file
extern "c" __declspec(dllimport) int __cdecl test();
//use function in main program
int i;
i=test();
注意:
(1)動態鏈結庫呼叫過程、函式時call方式 與建立時方式一樣不寫為__cdecl,其它需要宣告。
(2)bcb建立的dll有對應的輸入介面庫(import library),如只有dll而無庫時,可用bcb的implib工具產生:implib ***.lib ***.dll;另外可用:tlib***.lib,***.lst 產生dll的內部函式列表,許多windows的未公開技術就是用這種方法發現的。
2.動態呼叫法
動態呼叫法要用windows api 中的loadlibrary()和getprocaddress()來調入dll庫,指出庫中函式位置,這種方法較常見。
例程式如下:
hinstance dd;
int _stdcall (*ddd)(void);
dd=loadlibrary("***.dll");
ddd=getprocaddress(dd,"test");
caption=inttostr(ddd());
freelibrary(dd);
三、注意:
建立dll時編譯鏈結時注意設定project options。
packages標籤:去除builder with runtime packages檢查框。
linker標籤:去除use dynamic rtl檢查框。
否則建立的dll需要runtime packages or runtime library。
在C Builder中定義事件
在c builder中,事件是一種委託模型,它是對訊息的封裝。如果你用過vc,你就知道在vc中並不存在什麼事件,而只有訊息處理函式,而在c builder中則是由事件處理函式來負責響應訊息。同是,事件本身也是一指標,它是乙個閉包,通常在c builder中有兩種事件 通知型別事件 即tnotifye...
在C Builder中安裝odac元件
那麼下面就講下我的安裝過程吧,我使用cb6做的編譯,英文部落格中有說可以用批處理編譯的,但我沒有成功,也沒有繼續試驗。1 dac60.bpk 2 dacvcl60.bpk 3 dcldac60.bpk 5 odacvcl60.bpk 結果沒高興完,這一步又出錯了,不能再這樣再換版本了,於是想到以前做...
在C Builder中使用XP視覺樣式
在c builder中使用xp視覺樣式 sdragon 2006 12 28 14 53 使用c builder的朋友都知道,c builder是不支援xp視覺樣式的 vision style 以前我為了讓自己寫的程式看起來漂亮一些,拼命的去自繪控制項 我沒有使用過第三方介面控制項,曾經安裝過,但是...