怎樣在C++Builder中創建使用DLL |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
此為轉貼資料 怎樣在C++Builder中創建使用DLL (上海 施江傑)
自從C++Builder從去年浪漫情人節上市以來,吸引了大量的Delphi、VC、Vb的程式師到它的懷抱,大量的C、C++程式師感歎道:總算有了C的視覺化開發工具,對我也是一樣,從BC、Delphi到C++Builder。
動態連結程式庫(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*)
{
return 1;
}
int test()
{
return 3;
}
注意:動態連結程式庫中調用過程、函數時有不同的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 xxx.lib xxx.dll;另外可用:tlib xxx.lib,xxx.lst ?生DLL的內部函數列表,許多Windows的未公開技術就是用這種方法發現的。
2.動態調用法
動態調用法要用Windows API 中的LoadLibrary()和GetProcAddress()來調入DLL庫,指出庫中函數位置,這種方法較常見。
例程式如下:
HINSTANCE dd;
int _stdcall (*ddd)(void);
dd=LoadLibrary("xxx.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。
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |