procedure TForm1.Button1Click(Sender: TObject);
var str, str1, str2: array of pChar;
  sTempStr, sTempStr1, sDBName: string;
  iTemp: integer;
begin
  memo1.Lines.Clear;
  setLength(str, 12);
  setLength(str1, 12);
  setLength(str2, 12);
  sDBName := 'HY_ZZ_Z';
  sTempStr := 'D:\HY' + sDBName + 'BAK\F\';
  iTemp := 0;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Text := 'select * from company_info';
  ADOQuery1.Open;
  while not ADOQuery1.eof do
  begin
    str[iTemp] := pChar(sTempStr);
    sTempStr1 := ADOQuery1['dw_bm'] + '30' + '.ZIP';
    str1[iTemp] := pChar(sTempStr1);
    str2[iTemp] := pChar(sTempStr1 + '2007-09-21');
    iTemp := iTemp + 1;
    ADOQuery1.Next;
  end;
  text(str1);
  text(str2);
  text(str);
end;
function TForm1.text(sData: array of pChar): string;
var sTemp: string;
  iTemp: integer;
begin
  //memo1.Lines.Clear;
  for iTemp := 0 to length(sData) - 1 do
  begin
    sTemp := sData[iTemp];
    Memo1.Lines.Add(sData[iTemp]);
  end;
end;运行后结果
BC30.ZIP,
XB30.ZIPT
XA30.ZIP€
JN30.ZIP?
ZH30.ZIP?
LY30.ZIP4
SM30.ZIPp
LB30.ZIP?
WN30.ZIP?
1130.ZIP$
4430.ZIP`
5530.ZIP
5530.ZIP2007-09-21
5530.ZIP2007-09-21
5530.ZIP2007-09-21
5530.ZIP2007-09-21
5530.ZIP2007-09-21
5530.ZIP2007-09-21
5530.ZIP2007-09-21
5530.ZIP2007-09-21
5530.ZIP2007-09-21
5530.ZIP2007-09-21
5530.ZIP2007-09-21
5530.ZIP2007-09-21
D:\HYHY_ZZ_ZBAK\F\
D:\HYHY_ZZ_ZBAK\F\
D:\HYHY_ZZ_ZBAK\F\
D:\HYHY_ZZ_ZBAK\F\
D:\HYHY_ZZ_ZBAK\F\
D:\HYHY_ZZ_ZBAK\F\
D:\HYHY_ZZ_ZBAK\F\
D:\HYHY_ZZ_ZBAK\F\
D:\HYHY_ZZ_ZBAK\F\
D:\HYHY_ZZ_ZBAK\F\
D:\HYHY_ZZ_ZBAK\F\
D:\HYHY_ZZ_ZBAK\F\
上边有很多乱吗而且5530.ZIP2007-09-21这个值也不对!
每按一次按扭值都不大一样

解决方案 »

  1.   

    ...你不要用char类型试下,改用成string
      

  2.   

    不要随便烂用PCHAR    还是先改成 string吧   
      

  3.   

    值要住DLL里传呀
    换成string 回收DLL时出错~~~
    FreeLibrary(DLLHandle);
    这!
      

  4.   

    你可以转换   把string 类型转化成  char  
    用函数 CopyMemory
    例如:
    var
      s: string;
      buf: array[0..255] of char
    begin
      s:= 'fsdfdsfsdf';//假设
      fillChar(buf,sizeof(Buf),0);
      CopyMemory(@buf[0],@s[1],Length(s));
      //那么现在你可以用BUF 进行操作了   
    end;
      

  5.   

    用动态数组吧
    RecordCount:=ADOQuery1.RecordCount-1;
    setLength(str, RecordCount); 
    setLength(str1, RecordCount); 
    setLength(str2, RecordCount); 
      

  6.   

    改成string了
    引用ShareMem
    执行的时间都没错,一切好使可程序退出时出现 Invalid pointer operation
      

  7.   

    如果要传DLL,可以使用shortstring ...