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

利用Delphi設計DLL-函式返回值一組Integer Record:; 但始終為數據為空

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


發表:2
回覆:2
積分:0
註冊:2008-10-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2013-12-27 22:29:26 IP:59.124.xxx.xxx 訂閱
目前需要利用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;


(*//以下是我註解掉
// 利用兩種方式測試, 直接返回B組Record ,不接收A組Record,
// 只要不收A組Record ,當主程式一呼叫,立即返回相關數據,結果都是正常的


function RFoutEt(test:p_out):Boolean;stdcall; //ok Function 的撰寫方式
begin
test^.ST_act:=14;
test^.ST_move:=10;
test^.Revis:=12;
test^.Crchk:=8;


end;
exports RFoutEt;



procedure RFoutE(out Result:TRfout);cdecl; //ok Procedure 的撰寫方式
begin
Result.ST_act:=14;
Result.ST_move:=10;
Result.Revis:=12;
Result.Crchk:=8;

end;
exports RFoutE;

*)
//實際上我需要先收取主程式給我的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
加入以下紅色程式段後 ,Result不是值為空 就是顯示存取非法位址,造成程式異常終止
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的相關數據 來完成指定檔案的搬移

Result.ST_act:=4; //單獨以下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
回覆:1483
積分:1762
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2013-12-30 02:29:52 IP:114.36.xxx.xxx 訂閱
delph幾版寫的?
------



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

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


發表:2
回覆:2
積分:0
註冊:2008-10-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2013-12-30 14:14:24 IP:59.124.xxx.xxx 訂閱
            首先感謝回覆
我在delphi7跟delphi2010都有撰寫測試 ,測試平台目前只在Win7 32bit OS下
VC 是VS2010

我也試過改為 packed record ,還是失敗
jcjroc
高階會員


發表:21
回覆:276
積分:114
註冊:2002-09-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2014-01-01 22:41:24 IP:60.248.xxx.xxx 訂閱
回傳值當是Struct 時,最好用alloc記憶體
aftcast
站務副站長


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2014-01-02 00:08:55 IP:114.32.xxx.xxx 訂閱
我蠻肯定用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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2014-01-02 22:23:41 IP:59.124.xxx.xxx 訂閱
感謝各位撥空回覆小弟我的疑問 ,主要返回值其實也只有3個Interger數值 , 最後修改為返回1維陣列 也同樣達到效果

再次感謝大家協助

謝謝!!!
系統時間:2018-01-20 16:37:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!