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

導入VC來的DLL檔的問題

答題得分者是:aftcast
leochen1204
一般會員


發表:10
回覆:14
積分:4
註冊:2008-11-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-11-28 00:28:34 IP:59.105.xxx.xxx 訂閱
請問我想要在BCB裡使用一個從VC專案裡抓來的USB控制的DLL檔.  "USB_HID.dll"

我先利用implib將 USB_HID.dll轉成USB_HID.lib , 再將USB_HID.h檔及.lib檔copy到BCB專案中.

然後在Main.cpp中加入
#include "USBpro.h"
HANDLE m_hUSBDevice;
...
...
void __fastcall TMDIForm::Button1Click(TObject *Sender)
{
int status;
status=SI_USB_INIT(&m_hUSBDevice);
if(status){
Edit2->Text = "USB 連線ok!";
}
}

這樣好像不行厚... 會出現[Linker Error] Error: Unresolved external 'SI_USB_INIT(void * *)' referenced ...
這是哪裡不對呢???

附件link:
http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=96257
編輯記錄
taishyang 重新編輯於 2008-12-01 10:13:23, 註解 無‧
aftcast
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-28 01:17:50 IP:59.115.xxx.xxx 訂閱
請先參考一下我的blog,有問題再提出來!

http://aftcast.pixnet.net/blog/post/22191720
------



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

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
leochen1204
一般會員


發表:10
回覆:14
積分:4
註冊:2008-11-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-29 15:17:02 IP:140.113.xxx.xxx 訂閱
那可以幫我解釋一下這行的error是什麼意思嗎?
[Linker Error] Error: Unresolved external 'SI_USB_INIT(void * *)' referenced from C:\CTRL_20081127\DEBUG_BUILD\MAIN.OBJ

我的lib是用 implib -a -c -f xxx.lib xxx.dll的方式產生的
然後將 .lib及.h檔copy進去
專案中Add .lib檔
main.cpp 中 #include "xxx.h" 檔
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-29 20:45:35 IP:61.60.xxx.xxx 訂閱
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
aftcast
站務副站長


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-11-30 00:37:38 IP:122.120.xxx.xxx 訂閱
你好

如果還是不能解決,那請你把dll還有h檔rar上傳,我試著幫你制作lib檔看看,然後再把結果和你說


===================引 用 leochen1204 文 章===================
那可以幫我解釋一下這行的error是什麼意思嗎?
[Linker Error] Error: Unresolved external 'SI_USB_INIT(void * *)' referenced from C:\CTRL_20081127\DEBUG_BUILD\MAIN.OBJ

我的lib是用 implib -a -c -f xxx.lib xxx.dll的方式產生的
然後將 .lib及.h檔copy進去
專案中Add .lib檔
main.cpp 中 #include "xxx.h" 檔
------



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

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
leochen1204
一般會員


發表:10
回覆:14
積分:4
註冊:2008-11-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-11-30 07:49:23 IP:59.105.xxx.xxx 訂閱
感恩! 
另文附檔.
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-12-01 10:27:40 IP:118.169.xxx.xxx 訂閱
我幫忙把附件移到
http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=96257
aftcast
站務副站長


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-12-01 13:56:12 IP:122.120.xxx.xxx 訂閱
你好,

關於你二個dll的問題,其中一個很完整,即SiUSBXp.dll這個是使用stdcall的方式export出來的,很容易轉換,而它的header也宣告很完整。

然而USB_HID這個dll就不一樣了,我懷疑是出自同一個人(廠商)出來的嗎?

這個dll檔本的export function name被mangling過,這不是標準的寫法,一般來說只能專給vc使用。但我還是用了內力幫你修改了…

所以原來的dll被我修改成USB_HID_cb.dll,header檔也被我修正為USBpro_bc.h。另外多了二個bcb的lib檔USB_HID_cb.lib與SiUSBXp.lib。

至於修改的原理,它有太多的深入技術背景知識,一時半刻也無法說清楚。待你未來有時間去探討吧~

附上修好的dll加上我的test project


http://delphi.ktop.com.tw/download.php?download=upload/49337ac62b2a5_temp.rar
------



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

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2008-12-01 13:59:34, 註解 無‧
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-12-01 16:44:10 IP:118.169.xxx.xxx 訂閱
這個dll檔本的export function name被mangling過,這不是標準的寫法,一般來說只能專給vc使用。但我還是用了內力幫你修改了…
所以原來的dll被我修改成USB_HID_cb.dll,header檔也被我修正為USBpro_bc.h。另外多了二個bcb的lib檔USB_HID_cb.lib與SiUSBXp.lib。
至於修改的原理,它有太多的深入技術背景知識,一時半刻也無法說清楚。待你未來有時間去探討吧~

前輩內力深厚,等您有空,記得解說一下原理喔^_^

之前用extern "C" 結果function name前面多了個底線,比對了兩個dll
發現前輩把 ? 改成 _ 就可以work,真厲害


leochen1204
一般會員


發表:10
回覆:14
積分:4
註冊:2008-11-06

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-12-01 18:48:41 IP:203.71.xxx.xxx 訂閱
請問專案裡要Add 兩個DLL檔嗎? 
只Add兩個lib的話 編譯後會出現 "這個應用程式無法啟動,因為找不到 USB_HID_CB.DL,重新安裝應用程式可能可以解決這個問題。"

如果把DLL也ADD進來的話, 會出現Link Error
[Linker Error] Error: Error processing module C:\Temp\USB_HID_CB.DLL

taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-12-01 18:53:49 IP:118.169.xxx.xxx 訂閱
你有試過aftcast前輩提供的範例嗎?
我測試過,是可以用的

===================引 用 leochen1204 文 章===================
請問專案裡要Add 兩個DLL檔嗎?
只Add兩個lib的話 編譯後會出現 "這個應用程式無法啟動,因為找不到 USB_HID_CB.DL,重新安裝應用程式可能可以解決這個問題。"

如果把DLL也ADD進來的話, 會出現Link Error
[Linker Error] Error: Error processing module C:\Temp\USB_HID_CB.DLL
leochen1204
一般會員


發表:10
回覆:14
積分:4
註冊:2008-11-06

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-12-01 18:58:58 IP:203.71.xxx.xxx 訂閱
有, 但是因為沒有 bdsproj檔, 所以我不知道lib與DLL要怎麼在專案中載入.
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#13 引用回覆 回覆 發表時間:2008-12-01 19:03:04 IP:118.169.xxx.xxx 訂閱
我想前輩用的IDE應該是BCB6.0
只需要將lib檔加入專案中
BCB6.0的方式為[Project]->[Add to project]



===================引 用 leochen1204 文 章===================
有, 但是因為沒有 bdsproj檔, 所以我不知道lib與DLL要怎麼在專案中載入.
leochen1204
一般會員


發表:10
回覆:14
積分:4
註冊:2008-11-06

發送簡訊給我
#14 引用回覆 回覆 發表時間:2008-12-01 20:53:31 IP:59.105.xxx.xxx 訂閱
可是這樣DLL要放在哪兒呢?
好像應該放在同一資料夾中, 可是會出現"應用程式無法啟動, 因為找不到XXXX.DLL檔....."
或是說專案要設定Options讓它找得到DLL檔?

===================引 用 taishyang 文 章===================
我想前輩用的IDE應該是BCB6.0
只需要將lib檔加入專案中
BCB6.0的方式為[Project]->[Add to project]



===================引 用 leochen1204 文 章===================
有, 但是因為沒有 bdsproj檔, 所以我不知道lib與DLL要怎麼在專案中載入.
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#15 引用回覆 回覆 發表時間:2008-12-01 21:00:46 IP:118.169.xxx.xxx 訂閱
我用前輩的範例什麼都沒動,直接編譯就OK了
dll放在跟exe同一路徑中
leochen1204
一般會員


發表:10
回覆:14
積分:4
註冊:2008-11-06

發送簡訊給我
#16 引用回覆 回覆 發表時間:2008-12-01 21:05:04 IP:59.105.xxx.xxx 訂閱
我知道問題了~
因為在Run的時候是會建立一個Debug_Build的資料夾,
所以.dll檔案要自己先copy進去, 這樣在Run time階段才可以找到DLL檔~

感謝指導!
===================引 用 taishyang 文 章===================
我用前輩的範例什麼都沒動,直接編譯就OK了
dll放在跟exe同一路徑中
編輯記錄
leochen1204 重新編輯於 2008-12-01 21:27:22, 註解 無‧
boltnut
一般會員


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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2010-04-12 21:33:57 IP:123.192.xxx.xxx 訂閱

前輩我遇到相同的問題,但是是Silicon labs 2009版的USB DLL.
請問如何判斷原廠提供的是static 或dynamic DLL 呢?

我自己嘗試兩種方法都不行哩:
1) implib -a SiUSBXp_BCB.lib SiUSBXp.dll
2) coff2omf.exe SiUSBXp.lib SiUSBXp_BCB.lib
會不會這次2009版的USB DLL是dynamic DLL 呢?

請問該如何處理呢?能否step-by-step 說明一下呢?
原廠提供了SiUSBXp.dll, SiUSBXp.lib 和 SiUSBXp.h三個檔案.







編輯記錄
boltnut 重新編輯於 2010-04-12 21:43:35, 註解 無‧
系統時間:2017-10-24 1:09:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!