如何在VC++專案中使用BCB Dlls |
尚未結案
|
chrischung73
一般會員 發表:5 回覆:13 積分:3 註冊:2004-03-30 發送簡訊給我 |
|
chrischung73
一般會員 發表:5 回覆:13 積分:3 註冊:2004-03-30 發送簡訊給我 |
不好意思...未等到先進們的回答...自個兒就結案了 與 BCB 呼叫 VC dlls 方法差不多.
重要的是
1.用 $(BCB)\impdef.exe 產生 *.def
2.$(VC)\LIB.EXE 產生 VC 要用的 *.lib (參考其他網站寫出的範例不知如何上傳, 因此將說明列於下)
===========================================================================
===========================================================================
測試 VC application call BCB dlls.
//註1: 參考資料:
http://lhfc.myrice.com/newbcb/12/chap12.htm
http://www2.borland.com.tw/tw/td001018.html
//註2: 本範例中 BCB dll Form1僅Open一次, 第二次即會發生錯誤 ===========================================================================
方式一: dll 明確呼叫(explicited linked)
(一) BCB dll (DLLSAMP.DLL)
__declspec(dllexport) void ShowMyForm_el(char * const str);
//註:1.「extern "C"」,此處不使用之原因是:
a.同名之function (overload function) 僅能使用一次
b.if 使用 __stdcall 修飾字, ==>所產生之函數名稱為 ShowMyForm_el (相同)
if 使用 __cdecl 修飾字, ==>所產生之函數名稱為 _ShowMyForm_el (不同) (除__stdcall外, 餘皆產生不同的函數名稱)
既然採取要__cdecl 修飾字, 於VC Application明確呼叫時須呼叫不同函數名稱, 因此省略之
//註:2. 使用 __cdecl 修飾字
a.不寫修飾字等同於使用 __cdecl 修飾字
b.若使用 __stdcall修飾字, 於VC Application明確呼叫 "有參數" 的函數時會發生以下錯誤:
"The value of ESP was not properly saved across a function call.....with a diffrent calling convention"
(二) VC Application
void (*ShowMyForm)(void);
HINSTANCE hInst;
hInst = LoadLibrary("DLLSAMP.DLL");
(FARPROC &)ShowMyForm=GetProcAddress(hInst,"@ShowMyForm_el$qxpc"); //註:使用 $(BCB)\impdef.exe 查看函數名稱
ShowMyForm("abc");
// ShowMyForm("abc"); //註: ShowMyForm() 不可執行一次以上, BCB dll Bug???
FreeLibrary(hInst);
===========================================================================
/方式二/ dll 不明確呼叫(implicited linked)
(一) BCB dll (DLLSAMP.DLL)
extern "C" __declspec(dllexport) __cdecl void ShowMyForm(void);
__declspec(dllexport) __stdcall void ShowMyForm(char * const str);
(二) 中間過程
1. copy dll 至 app_path
2. $(BCB)\impdef.exe dllsamp.def dllsamp.dll
3. 修改 dllsamp.def
; (VC Function Name)=(BCB Function Name)
ShowMyForm=_ShowMyForm @1 ; _ShowMyForm
?ShowMyForm@@YGXPBD@Z=@ShowMyForm$qqsxpc @2 ; __stdcall ShowMyForm(char * const)
4. $(VC)\LIB.EXE /def:dllsamp.def
//註: output dllsamp.lib
(三) VC Application
1.將 (二).4. 所產出的 dllsamp.lib 加入專案
2. extern "C" void __declspec(dllimport) __cdecl ShowMyForm(void);
void __declspec(dllimport) __stdcall ShowMyForm(const char * str);
3. ShowMyForm();
ShowMyForm("abc");
//註: 1.如何得知 *.def中 VC Function Name要定義什麼?
有一懶人方法, 即省略步驟 (二). 3,
當在compile (三). 3時會發生錯誤「error LNK2001....(__imp_?ShowMyForm@@YGXPBD@Z)」,
而上述括號中__imp_之後的字串即為函數名稱
//註: 2.使用dll 不明確呼叫, 不論下列四項如何搭配皆可辦到
a. 是否加 extern "C"
b. function name 是否 overload
c. 使用 __stdcall 或 __cdecl修飾字
d. 是否有參數
|
chrischung73
一般會員 發表:5 回覆:13 積分:3 註冊:2004-03-30 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |