請問有關將結構指標傳入DLL時所產生的問題! |
尚未結案
|
chaichiya
一般會員 發表:4 回覆:5 積分:1 註冊:2003-09-17 發送簡訊給我 |
我試著將一個宣告如下的結構指標(在初始化後)傳入一個DLL內,卻發生傳入之結構內變數值均為亂數: ptDist = ^tDist; tDist = record
GroupNo: Word;
CarveType: Integer;
StartX,StartY: Double;
GroupFormat: Byte;
end;
....................... function Set_Group_Info(Group_Info: PChar):Integer; far; external '.\Gen.dll'; MyGroupInfo: ptDist;
Set_Group_Info( PChar(MyGroupInfo) );
........................ 在DLL這邊,函式如下:
function My_Set_Group_Info(Group_Info: PChar): Integer; export; cdecl;
var
GroupInfo: ptDist; begin GroupInfo := ptDist( Group_Info ); //此處印出傳入的值
...........................
ShowMessage( IntToStr(GroupInfo.GroupFormat) );
Result := 0;
end;
大致的程式如上所示。不知是什麼地方出了錯誤,導致傳入的值發生問題,希望大家幫找出問題所在。
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
chaichiya 你好
改為Pointer如何? function Set_Group_Info(Group_Info: Pointer):Integer; far; external '.\Gen.dll'; MyGroupInfo: ptDist; // 這邊是否要初始值呢? MyGroupInfo.GroupNo := xx ; MyGroupInfo.CarveType := x ; ..... Set_Group_Info( Pointer(MyGroupInfo) ); ........................ 在DLL這邊,函式如下: function My_Set_Group_Info(Group_Info: Pointer):Integer; export; cdecl; var GroupInfo: ptDist; begin GroupInfo := ptDist( Group_Info ); //此處印出傳入的值 ........................... ShowMessage( IntToStr(GroupInfo.GroupFormat) ); Result := 0; end;發表人 - chance36 於 2004/06/14 22:47:57 |
chaichiya
一般會員 發表:4 回覆:5 積分:1 註冊:2003-09-17 發送簡訊給我 |
|
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
Hi chaichiya您好:
除了Chance36兄的建議外, 也可以直接使用ptDist型態傳, 可節省轉換的時間,
另外不要使用"Far" 改成Stdcall來宣告.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; type ptDist = ^tDist; tDist = record GroupNo: Word; CarveType: Integer; StartX,StartY: Double; GroupFormat: Byte; end; function My_Set_Group_Info(Group_Info : ptDist):Integer; Stdcall; external '.\Gen.dll'; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var MyGroupInfo: ptDist; begin GetMem(MyGroupInfo, SizeOf(tDist)); with MyGroupInfo^ do begin GroupNo := 1; CarveType := 2; StartX := 1.11; StartY := 1.12; GroupFormat := 120; end; My_Set_Group_Info(MyGroupInfo); end; end. ************************************** DLL library Gen; uses SysUtils, Classes, Dialogs, Unit1; {$R *.res} function My_Set_Group_Info(Group_Info: ptDist): Integer; Stdcall; begin ShowMessage( IntToStr(Group_Info^.GroupFormat) ); Result := 0; end; exports My_Set_Group_Info; end.我不是高手, 高手是正在銀幕前微笑的人. 發表人 - miles 於 2004/06/15 03:12:44
------
我不是高手, 高手是正在銀幕前微笑的人. |
aquarius
資深會員 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
引言: 我試著將一個宣告如下的結構指標(在初始化後)傳入一個DLL內,卻發生傳入之結構內變數值均為亂數: ptDist = ^tDist; tDist = record GroupNo: Word; CarveType: Integer; StartX,StartY: Double; GroupFormat: Byte; end; ....................... function Set_Group_Info(Group_Info: PChar):Integer; far; external '.\Gen.dll'; MyGroupInfo: ptDist; Set_Group_Info( PChar(MyGroupInfo) ); ........................ 在DLL這邊,函式如下: function My_Set_Group_Info(Group_Info: PChar): Integer; export; cdecl; var GroupInfo: ptDist; begin GroupInfo := ptDist( Group_Info ); //此處印出傳入的值 ........................... ShowMessage( IntToStr(GroupInfo.GroupFormat) ); Result := 0; end; 大致的程式如上所示。不知是什麼地方出了錯誤,導致傳入的值發生問題,希望大家幫找出問題所在。你參數的傳遞方式用錯了. FAR 是 16 位元程式用的, 在 32 位元程式上會被編譯器忽略, 然後 DELPHI 內定的參數傳遞方式是 REGISTER . 但是你在 DLL 端又將 Function 宣告使用 CDECL 的方式. 你的程式沒直接當掉已經算是運氣好的了... 呼叫和被呼叫的
------
水瓶男的blog: http://791909.blogspot.com |
chaichiya
一般會員 發表:4 回覆:5 積分:1 註冊:2003-09-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |