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

請問該如何順利的接到由DLL所傳回的變數[:(!]

尚未結案
javyhuang
一般會員


發表:4
回覆:7
積分:2
註冊:2002-04-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-20 05:04:48 IP:218.162.xxx.xxx 未訂閱
各位先進您好: 我使用String去接DLL所傳回來的值,但是都無法順利接到值。 老是出現下列的訊息: ====================================================================================== Access violation at address 00457BD6 in module 'apps.exe' write of address 00000000 ====================================================================================== 迫切需要,請求支援,謝謝各位先進,小弟不聲感激。
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-20 08:57:33 IP:61.30.xxx.xxx 未訂閱
你好: 應該沒問題才是,可能是你函式宣告的方式有誤。下列程式碼給你參考。
DLL 內的宣告
function SayHello (UserID : String) : String; stdcall; export;    應用程式內的宣告
function SayHello (UserID : String) : String; stdcall; ;    implementation    function SayHello; stdcall; external 'TimerDLL.dll';    procedure TForm1.Button2Click(Sender: TObject);
var
  aaa : String;
begin
  aaa := SayHello ('CCJ');
  ShowMessage (aaa);
end;    
hcker
中階會員


發表:95
回覆:118
積分:62
註冊:2003-02-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-20 09:22:58 IP:218.19.xxx.xxx 未訂閱
string change to pchar test ----------要知道自己有多笨,到DelphiK.Top來看看----------
mike519
一般會員


發表:2
回覆:6
積分:11
註冊:2003-07-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-20 12:37:04 IP:211.75.xxx.xxx 未訂閱
一般Access violation...的問題大多都跟記憶體有關, 尤其是DLL使用動態鏈結, 必須在RunTime時才根據程式碼去呼叫副程式, 所以如果前後宣告不一致就容易產生這種問題, 建議你注意以下幾點: 1. DLL是否用Delphi編寫? 否則要注意Delphi 載入時的Calling convention的問題(cdecl or stdcall). 2. DLL內的參數宣告是否一致 (如String or PChar) 3. 載入時的名稱問題, 載入DLL時的名稱要注意大小寫, 之後使用時就不必! 如果你都檢查過了還不能解決, 就把程式碼附上來罷....:)
william
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-09-20 16:55:04 IP:210.3.xxx.xxx 未訂閱
If you want to use string in dll and exe (written in Delphi), remember to use the unit ShareMem as the very first unit in both .dpr files.
javyhuang
一般會員


發表:4
回覆:7
積分:2
註冊:2002-04-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-09-20 19:58:32 IP:218.162.xxx.xxx 未訂閱
ha0009 你好:    DLL 內的宣告 function SayHello (UserID : String) : String; stdcall; export; 應用程式內的宣告 function SayHello (UserID : String) : String; stdcall; ; implementation function SayHello; stdcall; external 'TimerDLL.dll'; procedure TForm1.Button2Click(Sender: TObject); var aaa : String; begin aaa := SayHello ('CCJ'); ShowMessage (aaa); end; 此DLL檔是以vc來撰成的,由third party所提供,裡邊的定義為何,在下並不知,依據它的API文件來看的話,它以你所說明的方式回傳值回來是沒有錯,不過它所指的是以類似call by reference的方式,且是在funcname(calref : Char*)來回傳的,現在我的問題就是這個calref的接值問題,當我以local的變數來接時,就會出現這樣的錯誤,這也是小弟一直困擾的問題。 以下就是它所提供的api文件: Function name time_getting(char *date_time) Description Get date and time Parameters date_time: 12 bytes char buffer to store date_time data (yymmddhhmmss) Return code 0 ==> FAIL 1 ==> SUCCESS
javyhuang
一般會員


發表:4
回覆:7
積分:2
註冊:2002-04-30

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-09-20 20:06:29 IP:218.162.xxx.xxx 未訂閱
引言: mike519 您好: 根據你的建議提出了以下的問題點,煩請指點: 1. DLL是否用Delphi編寫? 否則要注意Delphi 載入時的Calling convention的問題(cdecl or stdcall). 此DLL不是Delphi所編寫的,而是VC或VB來編寫的,另外你所指的Calling convention為何,小弟才疏學淺,有所不了,求請指點迷津。 2. DLL內的參數宣告是否一致 (如String or PChar) 問:當在DLL方面如是以Char*的方式來定義,而我這邊應該就是直接以String來接值沒錯吧!亦或可以以variant的型態來接值呢? 3. 載入時的名稱問題, 載入DLL時的名稱要注意大小寫, 之後使用時就不必!
javyhuang
一般會員


發表:4
回覆:7
積分:2
註冊:2002-04-30

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-09-20 23:55:22 IP:218.162.xxx.xxx 未訂閱
各位先進您好: 現在這個問題已經解決我在定義的地方以下列的方式處理: function time_getting(var returnvalue :ShortString): integer; stdcall; external 'INSTALL.DLL'; 但是現在又面臨了一個問題~~~就是我如果是以ShortString的方式接回來的話 確發現我所接回來的字串,在前二碼的地方確出現問題: 例如: 正確的回傳值應該是「930920212121」(yymmddhhmmss),但是我接到的值 透過showmessage來顯示的話,確變成是「20920212121」;而如果是 「990920212121」的話,還是變成是「20920212121」。 按照這樣的推論的話,好像是前兩碼都不見了,而以2來取代。 煩請各先進,指點迷津嘍!感激萬分!!
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-09-21 12:19:24 IP:61.56.xxx.xxx 未訂閱
你好: 你可以試試使用下列的方式宣告與使用。    function time_getting(T : PChar): integer; stdcall; external 'INSTALL.DLL';    var   T: String; begin   SetLength (T, 12);   if time_getting (@T [1]) = 0 then     ShowMessage ('成功')   else     ShowMessage ('失敗');      ShowMessage (T); end;    
javyhuang
一般會員


發表:4
回覆:7
積分:2
註冊:2002-04-30

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-09-21 12:45:11 IP:218.162.xxx.xxx 未訂閱
引言: function time_getting(T : PChar): integer; stdcall; external 'INSTALL.DLL'; var T: String; begin SetLength (T, 12); if time_getting (@T [1]) = 0 then ShowMessage ('成功') else ShowMessage ('失敗'); ShowMessage (T); end;
感謝大大,大大感謝: 果然這樣就可以了~~~~接到的值果然是我所要接到的長度~~~~~~ 但是現在又面臨了一個問題了,如果我所要接的值是未知的長度的話,那我又該如何的接受呢? 因為如果我把Setlength的地方拿掉,用String的型態接又不行,非得要指定長度給他:String[12]。 面臨這樣的問題我又該如何的解決呢?再次謝謝你的鼎力相助~~~~~~~感激!!
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-09-21 14:15:10 IP:61.56.xxx.xxx 未訂閱
你好: 通常函式的規格會告訴我們傳回值的最大長度,所以我們只要宣告一個最大長度的字串既可。
var
  Path : String;
begin
  SetLength (Path, MAX_PATH   1);
  GetPath (Path); // 假設這是取得路徑的函式,路徑最大長度為 MAX_PATH。
end;
chih_kuan
中階會員


發表:38
回覆:82
積分:54
註冊:2003-02-20

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-09-21 20:31:48 IP:218.162.xxx.xxx 未訂閱
引言: 你好: 通常函式的規格會告訴我們傳回值的最大長度,所以我們只要宣告一個最大長度的字串既可。
var
  Path : String;
begin
  SetLength (Path, MAX_PATH   1);
  GetPath (Path); // 假設這是取得路徑的函式,路徑最大長度為 MAX_PATH。
end;
感謝大哥.....鼎力相助.....有關此問題..已獲得解決....... 但是..現在又面臨另一問題...還望大哥...繼續指教... 現在我引用dll Function定義如下: function time_getting(returnvalue :Integer):integer;stdcall; external 'INSTALL.DLL'; 現在我一樣採 Call By Reference方式欲承接傳回值...其型態為Integer 我又該如何去承接此一傳回值呢????
------
叔叔有練過,初學者不要學。
系統時間:2024-05-03 16:39:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!