我向DLL传递一个STRING型的参数,在DLL中改变后传回来,但只要调用DLL函数的过程一执行完,就会报'invalid pointer opreation'无效指针操作的错误。DLL源码:library Project2;uses
SysUtils,
Classes;var
Apub:string;procedure www(var ATMP:string);StdCall;beginApub:='123';ATMP:='123';
//ATMP:=Apub;end;exports www;begin
end.end.程序源码:unit Unit1;interfaceuses
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;var
Form1: TForm1;implementationprocedure www(var ATMP:string);StdCall; external 'Project2.dll'{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
Atmp:string;beginwww(Atmp);showmessage(Atmp);end;end.我问了一下同事,他说,返回的变量必须是全局的,否则当执行完函数时变量的指针会指向无效的位置,我把//ATMP:=Apub;这句话不注销,运行真没有问题。但我不想DLL中所有的参数都设成全局,请问有没有更好的方法来实现。
SysUtils,
Classes;var
Apub:string;procedure www(var ATMP:string);StdCall;beginApub:='123';ATMP:='123';
//ATMP:=Apub;end;exports www;begin
end.end.程序源码:unit Unit1;interfaceuses
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;var
Form1: TForm1;implementationprocedure www(var ATMP:string);StdCall; external 'Project2.dll'{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
Atmp:string;beginwww(Atmp);showmessage(Atmp);end;end.我问了一下同事,他说,返回的变量必须是全局的,否则当执行完函数时变量的指针会指向无效的位置,我把//ATMP:=Apub;这句话不注销,运行真没有问题。但我不想DLL中所有的参数都设成全局,请问有没有更好的方法来实现。
或在dll和调用的单元的user里第一位加上Sharemem
uses
Sharemem,Windows, Messages,.......
或在dll和调用的单元的user里第一位加上Sharemem
uses
Sharemem,Windows, Messages,.......
结果,在DLL中给数组付值后,传回来,数组内容都有,但调用DLL函数的过程一结束,就会报'invalid pointer opreation'无效指针操作的错误。请问该如何解决?
begin
ATMP:='123';
end;...procedure TForm1.Button1Click(Sender: TObject);
var
Atmp:string[255];
begin
www(Atmp);
showmessage(Atmp);
end;
另外,把ATMP的类型变为ARRAY OF BYTE 该怎么写?
SysUtils,
Classes;var
Apub:string;procedure www(var ATMP:PChar);StdCall;
begin
Apub:='123';
ATMP:='123';
//ATMP:=Apub;
end;exports www;beginend.
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;var
Form1: TForm1;implementationprocedure www(var ATMP: PChar);StdCall; external 'Project2.dll'{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
Atmp: PChar;
begin
www(Atmp);
showmessage(Atmp);
end;end.
如果要用必须在定义和调用函数的单元里使Sharemem处于第一位,而且在分发程序时必须将一个动态库(忘了具体叫什么名字)一起分发
否则就使用PChar作参数。
如果作为var传入,别忘了在使用前一定要确保此参数已经有内存空间。
var
Atmp: PChar;
begin
www(Atmp);
showmessage(Atmp);
end;这样是不行的,因为变量Atmp还没有分配内存
最好不要使用var, 而使用dll中的输出
procedure www(ATMP: PChar);StdCall; application 中的调用
var
ATemp: array of char;
begin
SerLength(ATemp, templength);
StrpCopy(ATemp, AString);
www(ATemp);
Show(ATemp);
end
不要用string做dll的参数,也不要从dll返回string.
Sharemem,
SysUtils,
Classes;var
Apub:string;并且,在Delphi程序调用中也要USES ShareMem,只需在工程文件中加入,
program Project1;uses
ShareMem,
Forms,
Unit1 in 'Unit1.pas' {Form1};{$R *.res}begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
procedure www(ATMP: PChar);StdCall; application 中的调用
var
ATemp: array of char;
begin
SerLength(ATemp, templength);
StrpCopy(ATemp, AString);
www(ATemp);
Show(ATemp);
end你写的代码中参数ATMP的长度在调用DLL前已经确定了下来,而我是希望ATMP不确定长度,在DLL中确定他的长度和内容,再将他返回来。