全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2537
推到 Plurk!
推到 Facebook!

如何在VC++專案中使用BCB Dlls

尚未結案
chrischung73
一般會員


發表:5
回覆:13
積分:3
註冊:2004-03-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-14 14:22:47 IP:211.21.xxx.xxx 未訂閱
各位先進: 先前已發展出一BCB之DLL, 現要發展一VC 的專案, 不知VC 可否使用BCB之Dlls, 若可, 懇請告知方法 Thanks in advance!! Chris
chrischung73
一般會員


發表:5
回覆:13
積分:3
註冊:2004-03-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-16 17:09:08 IP:211.21.xxx.xxx 未訂閱
不好意思...未等到先進們的回答...自個兒就結案了 與 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-24 10:49:53 IP:211.21.xxx.xxx 未訂閱
See this http://bcbdev.com/articles/bcbdll.htm (不曉得有沒有辦法..把我上一篇的回應刪除..寫得太亂) Chris
系統時間:2024-06-28 13:29:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!