利用Delphi設計DLL-函式返回值一組Integer Record:; 但始終為數據為空 |
答題得分者是:aftcast
|
imusifa
一般會員 發表:2 回覆:2 積分:0 註冊:2008-10-11 發送簡訊給我 |
目前需要利用Delphi撰寫一支DLL,讓主程式呼叫,以處裡指定磁碟中某個文件的移動,
主程式以VC 設計的,所以利用Strut 方式來作為呼叫DLL的數據往返!! 目前遇到的問題是, 當主程式呼叫我的DLL時,傳入A組Record ,等函式處理完後,要返回B組Record, 但是利用Delphi撰寫的DLL,能收到A組Record ,但是返回B組,卻始終出現錯誤!! 以下是DLL該函數的代碼 ,想詢問有沒有人遇過這類問題,能幫忙提點題點 感謝!! DLL部分: library usbdll; uses Windows, SysUtils, Classes; {$R *.res} Type p_fin=^TSfin; TSfin = record //A組Record 是主程式呼叫時傳入的Record類型 ST_act:Integer; pathlen:Integer;//傳入真正路徑長度,以便我能由最左取到pathlen,以去除後方接著的亂碼 Id_hand:Integer; Id_tail:Integer; path: PWideChar: //之所以檔案路徑利用Pwidechar來做指引, 是因為主程式另一支dll是傳給主程式<檔案路徑 unicode>,就是路徑後面又拖著一堆亂碼字元 end; Type p_out=^TRfout; //B組Record 是要返回給主程式的Record類型 TRfout= Record ST_act:Integer; ST_move:Integer; Revis:Integer; Crchk:Integer; end; (*//實際上我需要先收取主程式給我的A組Record數據 , 以便在運算處理後,取得真正指定要移動的檔案真實路徑,最終返回B組Record function RFoutE(ap_sendin:p_fin;num:Integer):TRfout;stdcall; //error var str_tmp,str_tmp2,temi_diry:string; i,copyNum:Integer; arr: array[0..100] of Char; begin StrCopy(arr,Pchar(ap_sendin^.path)); repeat str_tmp:=temi_diry; //利用char陣列 將 A組裡的PWidechar所指的檔案路徑字串取出 /// str_tmp21:=ap_sendin.path^; str_tmp2:=arr[i]; Inc(i); until i>=ap_sendin.pathlen; copyNum:=Prs_Filecopy(temi_diry;ap_sendin^.path);//用A組Record的相關數據 來完成指定檔案的搬移 //單獨以下4行的話 是能返回數據 Result.ST_move:=0; Result.Revis:=2; Result.Crchk:=copyNum;//25; end; exports RFoutE; begin end. PS.以下是利用VC 嘗試測試以上的功能需求 是正常的 //==================================== struct Sfin{ int ST_act; int pathlen; int Id_hand; int Id_tail; wchar_t *path; }; struct Rfout{ int ST_act; int ST_move; int Revis; int Crchk; }; Rfout RFoutE(struct Sfin *a, int num) { int ret = 1; Rfout OutStruct; copyNum = Prs_Filecopy(temi_diry, inAnow, Anow->path); ret=1; if(ret==1){ OutStruct.ST_act =14; OutStruct.ST_move =10; OutStruct.Revis = 12; OutStruct.Crchk = 8; Anow = freeA(Anow); } return OutStruct; } //==================================== [code delphi] [/code] [code delphi] 請在此區域輸入程式碼 [/code] 編輯記錄
imusifa 重新編輯於 2013-12-28 20:29:35, 註解 無‧
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
|
imusifa
一般會員 發表:2 回覆:2 積分:0 註冊:2008-10-11 發送簡訊給我 |
|
jcjroc
高階會員 發表:21 回覆:279 積分:115 註冊:2002-09-18 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
我蠻肯定用delphi7時,你的程式碼應該就會錯! 因為 D7的 PCHAR 是對 char * ,指標一次是動一個byte,然而你輸入的路徑是unicode,即2bytes的。以AB這個字串來說,wideChar 在記憶體裡是 0x41 0x00 0x42 0x00,你強轉pchar的結果就是只會得到 A 這個字!
也就是StrCopy(arr,Pchar(ap_sendin^.path)); 這句話就會出乎意料之外! 若你用2010版,那應該會正確… 但你紅色區塊寫的很怪,比如temi_diry 怎麼宣告後塞給另一個字串? 然後又入 prs_filecopy… 程式應該很不完整。 ps_filecopy 的實作又為何? ===================引 用 imusifa 文 章=================== 首先感謝回覆 我在delphi7跟delphi2010都有撰寫測試 ,測試平台目前只在Win7 32bit OS下 VC 是VS2010 我也試過改為 packed record ,還是失敗
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
imusifa
一般會員 發表:2 回覆:2 積分:0 註冊:2008-10-11 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |