这是调用程序单元:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Unit2, StdCtrls;
type
IDData = record
ID: Integer;
end;
TIDDataArr = Array Of IDData;
PTIDDataArr = ^TIDDataArr;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
Procedure SetData_Pointer(P: Pointer);Stdcall; external 'Project2.dll';
Procedure SetDAta_Arr(Var DataArr: TIDDataArr); Stdcall; external 'Project2.dll';
Procedure SetDAtaArr_P(Var DataArr: PTIDDataArr); Stdcall; external 'Project2.dll';
implementation
{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
Var aa: TIDDataArr;
begin
SetData_Pointer(@aa);
ShowMessage(IntToStr(aa[0].ID));
SetLength(aa, 0);
end;procedure TForm1.Button2Click(Sender: TObject);
Var aa: TIDDataArr;
begin
SetDAta_Arr(aa);
ShowMessage(IntToStr(aa[0].ID));
end;procedure TForm1.Button3Click(Sender: TObject);
Var aa: PTIDDataArr;
begin
New(aa);
SetDAtaArr_P(aa);
ShowMessage(IntToStr(aa^[0].ID));
aa := Nil;
end;end.下面是DLL单元:
library Project2;uses
SysUtils,
ShareMem,
Classes;
type
IDData = record
ID: Integer;
end;
TIDDataArr = Array Of IDData;
PTIDDataArr = ^TIDDataArr;
{$R *.res}Procedure SetData_Pointer(P: Pointer);Stdcall;
Begin
SetLength(PTIDDataArr(P)^, 2);
PTIDDataArr(P)^[0].ID := 123;
PTIDDataArr(P)^[1].ID := 567;
End;Procedure SetDAta_Arr(Var DataArr: TIDDataArr); Stdcall;
Begin
SetLength(DataArr, 2);
DataArr[0].ID := 55555;
DataArr[1].ID := 66666;
End;Procedure SetDAtaArr_P(Var DataArr: PTIDDataArr); Stdcall;
Begin
SetLength(DataArr^, 2);
DataArr^[0].ID := 77777;
DataArr^[1].ID := 88888;
End;exports
SetData_Pointer,
SetDAta_Arr,
SetDAtaArr_P;
begin
end.
问题是我的调用单元中的三个方法调用都没有问题,就是在程序退出的时候不一样,
第三个问题不会报错,前两个问题都报无效的指针操作;为什么?????????????????
怎么解决??????,
还要说明一点就是我在调用程序单元引用ShareMem这个单元的时候不论执行那一个方法,程序退出的时候都会报错,就算什么都不做,程序运行起来,直接退出都报错,错误也是无效的指针操作;
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Unit2, StdCtrls;
type
IDData = record
ID: Integer;
end;
TIDDataArr = Array Of IDData;
PTIDDataArr = ^TIDDataArr;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
Procedure SetData_Pointer(P: Pointer);Stdcall; external 'Project2.dll';
Procedure SetDAta_Arr(Var DataArr: TIDDataArr); Stdcall; external 'Project2.dll';
Procedure SetDAtaArr_P(Var DataArr: PTIDDataArr); Stdcall; external 'Project2.dll';
implementation
{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
Var aa: TIDDataArr;
begin
SetData_Pointer(@aa);
ShowMessage(IntToStr(aa[0].ID));
SetLength(aa, 0);
end;procedure TForm1.Button2Click(Sender: TObject);
Var aa: TIDDataArr;
begin
SetDAta_Arr(aa);
ShowMessage(IntToStr(aa[0].ID));
end;procedure TForm1.Button3Click(Sender: TObject);
Var aa: PTIDDataArr;
begin
New(aa);
SetDAtaArr_P(aa);
ShowMessage(IntToStr(aa^[0].ID));
aa := Nil;
end;end.下面是DLL单元:
library Project2;uses
SysUtils,
ShareMem,
Classes;
type
IDData = record
ID: Integer;
end;
TIDDataArr = Array Of IDData;
PTIDDataArr = ^TIDDataArr;
{$R *.res}Procedure SetData_Pointer(P: Pointer);Stdcall;
Begin
SetLength(PTIDDataArr(P)^, 2);
PTIDDataArr(P)^[0].ID := 123;
PTIDDataArr(P)^[1].ID := 567;
End;Procedure SetDAta_Arr(Var DataArr: TIDDataArr); Stdcall;
Begin
SetLength(DataArr, 2);
DataArr[0].ID := 55555;
DataArr[1].ID := 66666;
End;Procedure SetDAtaArr_P(Var DataArr: PTIDDataArr); Stdcall;
Begin
SetLength(DataArr^, 2);
DataArr^[0].ID := 77777;
DataArr^[1].ID := 88888;
End;exports
SetData_Pointer,
SetDAta_Arr,
SetDAtaArr_P;
begin
end.
问题是我的调用单元中的三个方法调用都没有问题,就是在程序退出的时候不一样,
第三个问题不会报错,前两个问题都报无效的指针操作;为什么?????????????????
怎么解决??????,
还要说明一点就是我在调用程序单元引用ShareMem这个单元的时候不论执行那一个方法,程序退出的时候都会报错,就算什么都不做,程序运行起来,直接退出都报错,错误也是无效的指针操作;
解决方案 »
- delphi按钮图片问题+一个代码问题
- 关于ZIP解压缩的问题.
- 在delpi中,使192.168.167.22变为192.168.167.*有那些算法和主要用到的函数?
- IE工具条如何默认安装便显示?
- 急需MSCOMM控件作串口AT指令中英文短消息收发的代码!!!
- 帮忙!
- 急急急!请教ADSL编程问题?谢谢各位了!
- 谁有Borland Delphi 6 Personal Edition 的Serial Number 和Authorization key?
- 我想把我的toolbutton按纽加上图案我用了imagelist控件存储了六个图像,我的toolbutton也是六个,它们的imageindex属性值分别是0到5,请
- 大家好,本人初来乍到,给大家送个见面礼!多多关照!
- 一个互斥量的使用问题!
- 今天遇到的怪问题,帮忙解答一下!!
這個有問題, 正常要在調用端, 也就是 exe 中申請內存, 傳到dll中直接付值
New(aa);
SetDAtaArr_P(aa);你的想法是在调用方申请一块内存,然后就把指针传入dll中的函数,想法没有问题是没有错,只是觉得怪怪的。 SetDAtaArr_P(aa);这个函数可以 不用要,你直接就把aa这个变量的地址传过去就ok了,,比如:
Dll_func(@aa)
SetDAtaArr_P这个函数的参数是PTIDDataArr,说的了其实也是一个指针,如果不NEW的话是不行的,传@AA就是指针的指针了,