我向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中所有的参数都设成全局,请问有没有更好的方法来实现。

解决方案 »

  1.   

    不用string 用pchar类型做参数
    或在dll和调用的单元的user里第一位加上Sharemem 
    uses
      Sharemem,Windows, Messages,.......
      

  2.   

    不用string 用pchar类型做参数
    或在dll和调用的单元的user里第一位加上Sharemem 
    uses
      Sharemem,Windows, Messages,.......
      

  3.   

    我想向DLL中传递一个动态的字节数组(ARRAY OF BYTE),然后在DLL中确定数组的长度、具体内容,然后将结果传回来。
    结果,在DLL中给数组付值后,传回来,数组内容都有,但调用DLL函数的过程一结束,就会报'invalid pointer opreation'无效指针操作的错误。请问该如何解决?
      

  4.   

    procedure www(var ATMP:string[255]);StdCall;
    begin
      ATMP:='123';
    end;...procedure TForm1.Button1Click(Sender: TObject);
    var
      Atmp:string[255];
    begin
      www(Atmp);
      showmessage(Atmp);
    end;
      

  5.   

    to aiirii(ari-爱的眼睛) 你写的代码(procedure www(var ATMP:string[255]);StdCall;)编译通不过.
    另外,把ATMP的类型变为ARRAY OF BYTE 该怎么写?
      

  6.   

    library Project2;uses
      SysUtils,
      Classes;var
      Apub:string;procedure www(var ATMP:PChar);StdCall;
    begin
      Apub:='123';
      ATMP:='123';
      //ATMP:=Apub;
    end;exports www;beginend.
      

  7.   

    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: PChar);StdCall; external 'Project2.dll'{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      Atmp: PChar;
    begin
      www(Atmp);
      showmessage(Atmp);
    end;end.
      

  8.   

    在delphi中的dll参数不能直接使用string.
    如果要用必须在定义和调用函数的单元里使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
      

  9.   

    dll的格式是微软定的,string是delphi才有的。所以dll并不懂string是什么东西。
    不要用string做dll的参数,也不要从dll返回string.
      

  10.   

    String是delphi自己定义的字符串格式,是按照delphi内部的内存处理方式进行存储。所以要在DLL文件中使用String变量的话,一定要在uses的头第一位加上ShareMem,否则的话只能使用PChar类型作为传递参数,PChar是Windows dll 文件中标准的字符传递类型。library Project2;uses
      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.
      

  11.   

    to caihonghe(飘) :dll中的输出
    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中确定他的长度和内容,再将他返回来。
      

  12.   

    如果数据随时在改变,不如用映射内存的方式,可能要好些,省得随时调用DLL