使用问题。
PChar不管内存分配。
改用String吧

解决方案 »

  1.   

    PChar不是“生存期自管理类型”,所以管理起来比较麻烦,你可以使用string类型,当然了,如果你的字符串长度小于255的话,它就是一个shortstring类型,它不是一个“生存期自管理类型”,最好是声明为ansistring类型的,这样就不会有问题
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        ListBox1: TListBox;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  function GetInfo(var p1,p2,p3,p4,p5,p6,p7,p8,p9: String):integer;stdcall;var
      Form1: TForm1;
      st:integer;
      dest,source:array[0..255]of char;   //OK!implementation{$R *.DFM}function GetInfo(var p1,p2,p3,p4,p5,p6,p7,p8,p9: String):integer;stdcall;
    var
      return,i: integer;
      str: string;
      p:String;
    begin
      Result := 0;
      p1 := Copy(source,2,10);
      p2 := Copy(source,12,8);
      p3 := Copy(source,20,18);
      p4 := Copy(source,38,20);
      p5 := Copy(source,58,1);
      p6 := Copy(source,59,1);
      p7 := Copy(source,60,8);
      p8 := Copy(source,68,6);
      p9 := Copy(source,74,1);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      p1,p2,p3,p4,p5,p6,p7,p8,p9: String;
    begin
      listbox1.Clear;
      source := '200000000018888888814232619761225541XLIUJINWEI           101976122510000112002071120120711';  GetInfo(p1,p2,p3,p4,p5,p6,p7,p8,p9);  listbox1.items.add('p1:'+p1);
      listbox1.items.add('p2:'+p2);
      listbox1.items.add('p3:'+p3);
      listbox1.items.add('p4:'+p4);
      listbox1.items.add('p5:'+p5);
      listbox1.items.add('p6:'+p6);
      listbox1.items.add('p7:'+p7);
      listbox1.items.add('p8:'+p8);
      listbox1.items.add('p9:'+p9);
    end;end.
      

  3.   

    使用PChar获取返回数据前,首先应申请空间。unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        ListBox1: TListBox;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  function GetInfo(p1,p2,p3,p4,p5,p6,p7,p8,p9: PChar):integer;stdcall;var
      Form1: TForm1;
      st:integer;
      dest,source:array[0..255]of char;   //OK!implementation{$R *.DFM}function GetInfo(p1,p2,p3,p4,p5,p6,p7,p8,p9: PChar):integer;stdcall;
    var
      return,i: integer;
      str: string;
      p:PChar;
    begin
      Result := 0;
      StrPCopy(P1, copy(source,2,10));
      StrPCopy(p2, copy(source,12,8));
      StrPCopy(p3, copy(source,20,18));
      StrPCopy(p4, copy(source,38,20));
      StrPCopy(p5, copy(source,58,1));
      StrPCopy(p6, copy(source,59,1));
      StrPCopy(p7, copy(source,60,8));
      StrPCopy(p8, copy(source,68,6));
      StrPCopy(p9, copy(source,74,1));
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      p1,p2,p3,p4,p5,p6,p7,p8,p9: array[0..255]of char;
    begin
      listbox1.Clear;
      source := '200000000018888888814232619761225541XLIUJINWEI           101976122510000112002071120120711';  GetInfo(
        PChar(@p1),
        PChar(@p2),
        PChar(@p3),
        PChar(@p4),
        PChar(@p5),
        PChar(@p6),
        PChar(@p7),
        PChar(@p8),
        PChar(@p9)
      );  listbox1.items.add('p1:'+p1);
      listbox1.items.add('p2:'+p2);
      listbox1.items.add('p3:'+p3);
      listbox1.items.add('p4:'+p4);
      listbox1.items.add('p5:'+p5);
      listbox1.items.add('p6:'+p6);
      listbox1.items.add('p7:'+p7);
      listbox1.items.add('p8:'+p8);
      listbox1.items.add('p9:'+p9);
    end;end.
      

  4.   

    建议用Stirng;pchar只是指针,需要自己管理内存空间
      

  5.   

    Borlandor(五角▲大民),你的办法好象编译有错误。
    大家好,对于使用其他的类型,完全没有问题,我就是想把PCHAR搞明白!!!
      

  6.   

    多谢各位,此问题我已经解决。
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        ListBox1: TListBox;
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        Button2: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  function GetInfo(var p1,p2,p3,p4,p5,p6,p7,p8,p9: PChar):integer;stdcall;var
      Form1: TForm1;
      st:integer;
      dest,source:array[0..255]of char;   //OK!implementation{$R *.DFM}function GetInfo(var p1,p2,p3,p4,p5,p6,p7,p8,p9: PChar):integer;stdcall;
    var
      return,i: integer;
      str: string;
      p:PChar;
    begin
      Result := 0;
      StrPCopy(P1, copy(source,2,10));
      StrPCopy(p2, copy(source,12,8));
      StrPCopy(p3, copy(source,20,18));
      StrPCopy(p4, copy(source,38,20));
      StrPCopy(p5, copy(source,58,1));
      StrPCopy(p6, copy(source,59,1));
      StrPCopy(p7, copy(source,60,8));
      StrPCopy(p8, copy(source,68,6));
      StrPCopy(p9, copy(source,74,1));
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      p1,p2,p3,p4,p5,p6,p7,p8,p9:pchar;  //array[0..155] of char;
    begin
      listbox1.Clear;
      source := '200000000018888888814232619761225541XLIUJINWEI           101976122510000112002071120120711';
      getmem(p1,30);
      getmem(p2,30);
      getmem(p3,30);
      getmem(p4,30);
      getmem(p5,30);
      getmem(p6,30);
      getmem(p7,30);
      getmem(p8,30);
      getmem(p9,30);
      GetInfo(p1,p2,p3,p4,p5,p6,p7,p8,p9);  listbox1.items.add('p1:'+p1);
      listbox1.items.add('p2:'+p2);
      listbox1.items.add('p3:'+p3);
      listbox1.items.add('p4:'+p4);
      listbox1.items.add('p5:'+p5);
      listbox1.items.add('p6:'+p6);
      listbox1.items.add('p7:'+p7);
      listbox1.items.add('p8:'+p8);
      listbox1.items.add('p9:'+p9);
    end;end.