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

Delphi 呼叫 dll

答題得分者是:cmf
sally
一般會員


發表:10
回覆:21
積分:6
註冊:2003-08-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-02 11:01:19 IP:61.13.xxx.xxx 未訂閱
請教各位先進,Delphi呼叫由VC 寫的dll,若資料型態(以VB為例)為byte array,請問在Delphi要如何定義變數的資料型態? 我先定義type TBuf = Array of Byte;再在呼叫dll的function內宣告data_buf : TBuf;編譯時沒問題,但執行時出現Access violaton的錯誤訊息, 謝謝不吝指教!!
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-02 11:26:56 IP:147.8.xxx.xxx 未訂閱
pointer, PChar, PByteArray etc. array of byte is Delphi's own dynamic array.
sally
一般會員


發表:10
回覆:21
積分:6
註冊:2003-08-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-02 13:14:09 IP:61.13.xxx.xxx 未訂閱
Hi,William:雖然看懂你的意思,但實際上Delphi要如何宣告dll function內此種型態的資料?另外呼叫這個function的資料型態是否也要這樣宣告?謝謝!
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-02 13:24:03 IP:61.218.xxx.xxx 未訂閱
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30178
------
︿︿
sally
一般會員


發表:10
回覆:21
積分:6
註冊:2003-08-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-09-02 14:27:49 IP:61.13.xxx.xxx 未訂閱
各位先進,不好意思,發現另一個相關問題:若以VC 寫dll,其中變數宣告為address型態(eg. int *c_data_len),在Delphi如何宣告呼叫到的dll function包含這種型態的變數?另程式碼如何讀取此address內的值?謝謝!!
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-09-03 13:56:13 IP:61.216.xxx.xxx 未訂閱
文章重複發表問題. http://delphi.ktop.com.tw/topic.php?TOPIC_ID=36828    .請本區相關單位...放入回收區 < src="http://delphi.ktop.com.tw/download/upload\33223_qoo.gif">網海無涯,學無止境!
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-09-03 14:25:23 IP:61.218.xxx.xxx 未訂閱
取自 sally 所發表另一主題 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=36828 該處發表刪除 ----------------------------------------------------------------------- 請教各位先進:Delphi 呼叫 VC++ 寫的 dll,其中一個函式內含3個參數,原函式及資料型態為int WINAPI RecvFromClient(LPSTR c_client_id, LPSTR c_data_buf, int *c_data_len);其中 LPSTR 在 VC++ 中的定義為 A 32-bit pointer to a character string,而 c_data_len 應為傳址方式,請問在Delphi應該如何宣告才對?謝謝! 另,前次問題不明確,浪費大家時間,對不起!    
sally
一般會員


發表:10
回覆:21
積分:6
註冊:2003-08-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-09-03 14:57:18 IP:61.13.xxx.xxx 未訂閱
對不起,我要保留被刪除的問題,反而是這個問題不清楚可以刪除。
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-09-03 15:34:26 IP:61.216.xxx.xxx 未訂閱
引言: 對不起,我要保留被刪除的問題,反而是這個問題不清楚可以刪除。
就此問題,大家若有解答..在此回覆即可! 請教各位先進:Delphi 呼叫 VC 寫的 dll 1.其中一個函式內含3個參數,原函式及資料型態為 int WINAPI RecvFromClient(LPSTR c_client_id, LPSTR c_data_buf, int *c_data_len); 2.其中 LPSTR 在 VC 中的定義為 A 32-bit pointer to a character string,而 c_data_len 應為傳址方式 請問在Delphi應該如何宣告才對? 網海無涯,學無止境!
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-09-03 17:14:06 IP:61.218.xxx.xxx 未訂閱
unit XXXUnit; interface function RecvFromClient(c_client_id,c_data_buf:Pchar;c_data_len:Pinteger):integer; implementation const dllname='XXXXX.dll'; function RecvFromClient; external dllname name 'RecvFromClient'; end.
------
︿︿
sally
一般會員


發表:10
回覆:21
積分:6
註冊:2003-08-08

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-09-03 19:00:38 IP:61.13.xxx.xxx 未訂閱
Hi, cmf:我試過您建議的方法,但仍不對。謝謝!
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-09-04 00:05:01 IP:61.70.xxx.xxx 未訂閱
不會吧 @@ 要不要把你的 程式 貼上來 看看....
------
︿︿
sally
一般會員


發表:10
回覆:21
積分:6
註冊:2003-08-08

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-09-04 08:47:11 IP:61.13.xxx.xxx 未訂閱
Hi,cmf:我用的Delphi版本為5.0,並沒有Pinteger的資料型態,謝謝。
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-09-04 09:03:36 IP:61.218.xxx.xxx 未訂閱
TYPE PInteger = ^Integer;
------
︿︿
sally
一般會員


發表:10
回覆:21
積分:6
註冊:2003-08-08

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-09-04 09:39:43 IP:61.13.xxx.xxx 未訂閱
Hi, cmf:以下為Delphi部份程式碼 type PInteger = ^Integer; function RecvFromClient(Client_Id: PChar; Data_Buf: PChar; Data_Len: PInteger): Longint; implementation const dllname = 'test.dll'; function RecvFromClient; external dllname name 'RecvFromClient'; 編譯後的錯誤訊息為:Function needs result type 若將最後一列修正為 function RecvFromClient: Longint; external dllname name 'RecvFromClient'; 則編譯後出現:Previous declaration of "RecvFromClient' not marked with the 'overload' directive 請問是否是那裡寫錯了?謝謝!!
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-09-04 10:39:36 IP:61.218.xxx.xxx 未訂閱
type PInteger = ^Integer; function RecvFromClient(Client_Id: PChar; Data_Buf: PChar; Data_Len: PInteger): Longint; stdcall; implementation const dllname = 'test.dll'; function RecvFromClient; external dllname name 'RecvFromClient';
------
︿︿
sally
一般會員


發表:10
回覆:21
積分:6
註冊:2003-08-08

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-09-04 11:12:10 IP:61.13.xxx.xxx 未訂閱
Hi, cmf:這個dll的其它函式,其中connect及disconnect都沒問題,但recv就是不過, type PInteger = ^Integer; type TChar = Array of Char; function Connect_Request(Dest: String; Port_Num: Longint): Longint; stdcall; function Disconnect_Request(): Longint; stdcall; function RecvFromClient(Client_Id: TChar; Data_Buf: TChar; Data_Len: PInteger): Longint; stdcall; implementation const dllname = 'test.dll'; function Connect_Request(Dest: String; Port_Num: Longint): Longint; external dllname name 'Connect_Request'; function Disconnect_Request(): Longint; external dllname name 'Disconnect_Request'; function RecvFromClient(Client_Id: TChar; Data_Buf: TChar; Data_Len: PInteger): Longint; external dllname name 'RecvFromClient'; 錯誤訊息如下:Project Project1.exe raised exception class EAcessViolation with message "Access violation at address 100014F7 in module 'test.dll'. write of address 00000000'. Process stopped. Use Stop or Run to continue. 另,雖然這支dll是公司同事寫的,但基於保密安全考量,他不方便提供原始碼讓我trace,所以增加排除問題的困難度;再次麻煩您了,謝謝!
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#18 引用回覆 回覆 發表時間:2003-09-04 12:07:52 IP:61.218.xxx.xxx 未訂閱
@@ 請使用 "PCHAR" function RecvFromClient(Client_Id:PCHAR; Data_Buf: PCHAR; Data_Len: PInteger): Longint; stdcall; 1. 請確定 RecvFromClient 名稱是否正確 2. 你是如何呼叫的?
------
︿︿
sally
一般會員


發表:10
回覆:21
積分:6
註冊:2003-08-08

發送簡訊給我
#19 引用回覆 回覆 發表時間:2003-09-04 13:11:13 IP:61.13.xxx.xxx 未訂閱
Hi, cmf:函式名稱沒錯,以VB呼叫此dll,所有功能均可正常執行。 ...... {$R *.DFM} var LbyRecv_Id: TChar; LbyRecv_Data: TChar; LlRecv_Len: PInteger; ...... procedure TForm1.Timer1Timer(Sender: TObject); var Ll_Return: Longint; begin Ll_Return := RecvFromClient(LbyRecv_Id, LbyRecv_Data, LlRecv_Len); ......
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#20 引用回覆 回覆 發表時間:2003-09-04 13:27:36 IP:61.218.xxx.xxx 未訂閱
var LbyRecv_Id: TChar; LbyRecv_Data: TChar; LlRecv_Len: PInteger; Recv_Id:array[0..512] of Char; Recv_Data:array[0..512] of Char ; Recv_Len:Integer; procedure TForm1.Timer1Timer(Sender: TObject); var Ll_Return: Longint; begin Recv_Len:=512; LbyRecv_Id :=@Recv_Id[0]; LbyRecv_Data:=@Recv_Data[0]; LlRecv_Len :=@Recv_Len; Ll_Return := RecvFromClient(LbyRecv_Id, LbyRecv_Data, LlRecv_Len); ......
------
︿︿
sally
一般會員


發表:10
回覆:21
積分:6
註冊:2003-08-08

發送簡訊給我
#21 引用回覆 回覆 發表時間:2003-09-04 14:35:07 IP:61.13.xxx.xxx 未訂閱
感謝 cmf 不厭其煩的解答,終於有進展了,謝謝!!
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#22 引用回覆 回覆 發表時間:2003-09-04 14:45:15 IP:61.218.xxx.xxx 未訂閱
恭喜你 ^_^
------
︿︿
系統時間:2024-05-09 17:47:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!