請問該如何順利的接到由DLL所傳回的變數[:(!] |
尚未結案
|
javyhuang
一般會員 發表:4 回覆:7 積分:2 註冊:2002-04-30 發送簡訊給我 |
各位先進您好:
我使用String去接DLL所傳回來的值,但是都無法順利接到值。
老是出現下列的訊息:
======================================================================================
Access violation at address 00457BD6 in module 'apps.exe' write of address 00000000
====================================================================================== 迫切需要,請求支援,謝謝各位先進,小弟不聲感激。
|
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
你好:
應該沒問題才是,可能是你函式宣告的方式有誤。下列程式碼給你參考。
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 發送簡訊給我 |
|
mike519
一般會員 發表:2 回覆:6 積分:11 註冊:2003-07-13 發送簡訊給我 |
一般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 發送簡訊給我 |
|
javyhuang
一般會員 發表:4 回覆:7 積分:2 註冊:2002-04-30 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
各位先進您好:
現在這個問題已經解決我在定義的地方以下列的方式處理:
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 發送簡訊給我 |
|
javyhuang
一般會員 發表:4 回覆:7 積分:2 註冊:2002-04-30 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
chih_kuan
中階會員 發表:38 回覆:82 積分:54 註冊:2003-02-20 發送簡訊給我 |
引言: 你好: 通常函式的規格會告訴我們傳回值的最大長度,所以我們只要宣告一個最大長度的字串既可。感謝大哥.....鼎力相助.....有關此問題..已獲得解決....... 但是..現在又面臨另一問題...還望大哥...繼續指教... 現在我引用dll Function定義如下: function time_getting(returnvalue :Integer):integer;stdcall; external 'INSTALL.DLL'; 現在我一樣採 Call By Reference方式欲承接傳回值...其型態為Integer 我又該如何去承接此一傳回值呢????var Path : String; begin SetLength (Path, MAX_PATH 1); GetPath (Path); // 假設這是取得路徑的函式,路徑最大長度為 MAX_PATH。 end;
------
叔叔有練過,初學者不要學。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |