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

把VC的DLL轉換到BCB使用

 
CoffeeX
中階會員


發表:18
回覆:121
積分:72
註冊:2005-02-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-08-28 21:00:19 IP:140.125.xxx.xxx 訂閱

有鑑於很多人問到如何使用VC的DLL於BCB,


小弟我把當初使用opencv的投影片,及說明檔放上來


某些錯誤的部份還請各位大大指正

------
=.=???
附加檔案:VcDll2Bcb.rar
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-08-31 08:42:47 IP:61.229.xxx.xxx 未訂閱

謝謝coffeex的分享,我也補充一下在我blog上的文章一篇:


對於cpp的function與class基本上是無法互用的,因為name mangling的問題等等…

BCB對於cdecl convention的function是會在function前面加上 _ 底線。
BCB對於stdcall 的部份則是沒加 _ 。

VC 無論是否為stdcall或是cdecl都是不加 _ 底線。

所以在製作for BCB lib from VC DLL時需要用下面的方法:
implib -a -c -f xxx.lib xxx.dll ::a switch force add _ alias to MS cdecl

或者可由impdef程式產生的DEF檔觀察,並進一步修正DEF檔,然後用個自的lib工具來製作lib檔。
若從VC.DLL來產生def檔,則會看到都沒有底線。此時為了要給BCB使用,則需要將dll中屬於cdecl的部份自己加上 _ 底線的alias(=號左邊),再用implib產生LIB檔,以"騙"BCB正常呼叫,但實則對應到沒有底線的DLL檔。相反的,若從BCB.DLL來產生def則會發現cdecl的部份都有 _ 底線,為了要給VC用,則要自行去底線,再由VC自帶的lib /DEF:xxx.def來產生。

PS 為了仰制name mangling,一定要使用extern "C",這樣才可以交互使用。另外,若是都使用stdcall convention則因為無論VC或是BCB都不加底線,轉換就很單純,完全不用修正!

注意! BCB的DEF檔的alias與VC的DEF檔的alias方向似乎不同:
BCB : link phrase matching = name of the function that is exported
VC : name of the function that is exported = link phrase matching

蕭沖 qs.xiao@gmail.com
http://aftcast.blogspot.com/

------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-09-01 04:26:31 IP:61.229.xxx.xxx 未訂閱
發現上篇中關於stdcall的部份,我寫錯了,補正一下:

僅有fastcall與cdecl這二種convention配合C的函式編碼(使用extern"C")才可以互用。cpp的overloading function,class等都是無法互通的!

BCB對於cdecl convention的function是會在function前面加上 _ 底線。
BCB對於stdcall 的部份則是沒加 _ 。
VC的部份則是相反。

__________________________________________________________________
|呼 叫 慣 例 | 原 始 函 式 | Borland C Builder |Microsoft Visual C |
| __cdecl | MyFunc_cdcel| _MyFunc_cdcel | MyFunc_cdcel |
| __stdcall | MyFunc_std | MyFunc_std | _MyFunc_std@8 |
| __fastcall | MyFunc_fast | @MyFunc_fast | @MyFunc_fast@8 |
-----------------------------------------------------------------------


所以在製作for BCB lib from VC DLL時需要用下面的方法(針對cdcel的部份):
implib -a -c -f xxx.lib xxx.dll ::a switch force add _ alias to MS cdecl

或者可由impdef程式產生的DEF檔觀察,並進一步修正DEF檔,然後用個自的lib工具來製作lib檔。
若從VC.DLL來產生def檔,則會看到都沒有底線。此時為了要給BCB使用,則需要將dll中屬於cdecl的部份自己加上 _ 底線的alias(=號左邊),再用implib產生LIB檔,以"騙"BCB正常呼叫,但實則對應到沒有底線的DLL檔。相反的,若從BCB.DLL來產生def則會發現cdecl的部份都有 _ 底線,為了要給VC用,則要自行去底線,再由VC自帶的lib /DEF:xxx.def來產生。

PS 為了仰制name mangling,一定要使用extern "C",這樣才可以交互使用。

注意! BCB的DEF檔的alias與VC的DEF檔的alias方向似乎不同:
BCB : link phrase matching = name of the function that is exported
VC : name of the function that is exported = link phrase matching
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
CoffeeX
中階會員


發表:18
回覆:121
積分:72
註冊:2005-02-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-09-01 10:20:22 IP:140.125.xxx.xxx 訂閱

謝謝aftcast大大的指教,這部份本來我就很想學了,

不過不太清楚這方面資料的來源,

其次關於coff,與omf這方面不知您清楚嗎?

因為我在作轉檔略為看到這方面的資料,

但還搞不太懂...

------
=.=???
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-09-01 15:23:22 IP:61.229.xxx.xxx 未訂閱
sorry,我也曾找過相關的資料,但真的太少了,尤其是omf的部份,因為幾乎沒在用了,所以沒什麼文件。
再者,m$ 的 coff 與unix下的coff 實有所不同,它是變種的… 若有機會再看到這類的資料,我會通知你分享一下的 :-)

===================引 用 文 章===================

其次關於coff,與omf這方面不知您清楚嗎?

------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-09-08 14:49:46 IP:219.84.xxx.xxx 未訂閱

PE檔頭的部份,我有寫過解析的程式,程式有發表在本站...

那時是參考Windows 95 System Programming SECRETs。裡面有很詳細的資料

另外aftcast大大的解析詳細...

以前我只記得BCB的宣告一定要加stdcall, M$的則是cdecl..

這篇終於有完整的結果,應該要收入精華文章的~

只是版主權限不知什麼時候能回復Orz....


===================引 用 文 章===================

謝謝aftcast大大的指教,這部份本來我就很想學了,

不過不太清楚這方面資料的來源,

其次關於coff,與omf這方面不知您清楚嗎?

因為我在作轉檔略為看到這方面的資料,

但還搞不太懂...

boltnut
一般會員


發表:5
回覆:12
積分:3
註冊:2010-02-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-11-03 09:40:31 IP:203.73.xxx.xxx 訂閱
小弟才疏學淺. 不知如何如何將Silicon Lab公司的USBXpress v3.3 的VC LIB 轉成BCB OMF格式.
www.silabs.com/products/mcu/Pages/USBXpress.aspx
系統時間:2017-10-19 8:11:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!