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

請問有關將結構指標傳入DLL時所產生的問題!

尚未結案
chaichiya
一般會員


發表:4
回覆:5
積分:1
註冊:2003-09-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-06-14 19:50:51 IP:211.23.xxx.xxx 未訂閱
我試著將一個宣告如下的結構指標(在初始化後)傳入一個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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-06-14 22:44:32 IP:211.20.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-06-15 01:10:13 IP:218.170.xxx.xxx 未訂閱
謝謝你的建議,我的程式中有初始化才傳入指標,也確定在傳入前的值是正確的,您的方法我試過了,不過如預期一般無效! 請大家多多給我不同的意見!謝謝! 發表人 - chaichiya 於 2004/06/15 01:13:14
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-06-15 03:10:22 IP:61.30.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-06-15 10:26:00 IP:210.243.xxx.xxx 未訂閱
引言: 我試著將一個宣告如下的結構指標(在初始化後)傳入一個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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-06-15 10:36:41 IP:211.23.xxx.xxx 未訂閱
果然是 far 的問題,謝謝大家的幫忙! 很難給誰這一分,不過由於是Miles先po出這一段,所以這一分就給Miles了。 也謝謝 Aquarius 的詳細解釋,這樣的問題下一次就不會再犯了!
系統時間:2024-05-15 15:24:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!