http://delphi.ktop.com.tw/board.php?cid=168&fid=923&tid=33420
主要步驟如下:
1. 先建立一個lib檔,要注意MFC及Pre-compiled header不能打勾。
2. 利用剛剛的lib建立dll檔,MFC不打勾,export symbols要打勾。
3. bcb中使用vc建立的dll有兩個方法,一個是靜態的連接,一個是動態的
static - 利用implib將剛剛建立的dll轉成lib(implib -a VCLib.lib VCDll.dll),接著在bcb專案中加入此lib檔,並將dll的header 引入。
dynamic - 只要將vc建立的dll檔與bcb專案放在同一個資料夾即可。
名詞解釋
extern "C" - 在c++中有overloading的功能,因此compiler會自動在function name上加參數簽名,這也就是所謂的name mangling,但是這麼一加問題就來了,如果我們使用c++去連接c的header,就會因為function name不同而發生連結錯誤;除此之外,不同的compiler的mangling方式也不同,這也就是為什麼vc編出來的dll要先經過implib轉換才能被bcb所使用。為了讓compiler不會對function name亂加簽名,就必須要在function前面加上這個,例如:
#ifdef __cplusplus
extern "C" {
#endif
...
#ifdef __cplusplus
}#endif
__cplusplus是c++ compiler中define的macro,c compiler沒有。
參考資料:
http://aftcast.pixnet.net/blog/post/22457055
http://www.cnblogs.com/stonecrazyking/archive/2006/09/23/512552.html
__declspec(dllexport) - 這個修飾字是用來告訴compiler,這個function是要export給別的程式使用的,而且不需使用*.def來定義。
參考資料:
http://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx
APIENTRY -
#define APIENTRY WINAPI
#define WINAPI __stdcall
DLLMain - dll中的入口,可有可無,如果沒定義,編譯器會自己定義
參考資料:
http://msdn.microsoft.com/en-us/library/ms682583.aspx
LoadLibrary, GetProcAddress, FreeLibrary - 連結dll有兩種方式,一種是linking implicitly,在連結前必須要把*.lib加入專案中,另一種是linking explicitly,不須加入*.lib,呼叫時需使用function pointer及這三個function
參考資料:
http://msdn.microsoft.com/en-us/library/9yd93633.aspx
bcb
如果在linking階段,出現[Linker Error] Unresolved external ...
1.lib沒有add到專案裡
2.implib的時候沒加-a參數
沒有留言:
張貼留言