以下是我写的一个函数,我把放在Dll中使用!
function ASTGetUser(index: Integer): Pchar; stdcall;
var
  UserName: array[0..20] of char;
  UserCount: Integer;
  F: File;
  TmpName: array[0..19] of char;
begin
  UserCount := ASTUserCount;
  Result := '';
  if (index > 0) and (index <= UserCount) then
  begin
    AssignFile(F, ExtractFilePath(ASTModulePath) + 'UserList.Dat');
    Reset(F, 1);
    Seek(F, (index - 1) * 21);
    BlockRead(F, UserName[0], 21);
    CloseFile(F);
    Move(UserName[1], Result[0], 20);
    Result := TmpName;
  end;
end;
注意最后两句:
    Move(UserName[1], TmpName[0], 20);
    Result := TmpName;上面的方法可行,但我用其他方法都不能正确得到返回值,不知道为什么,希望高手解释一下!
例如我用:
  Result := PChar(@UserName[1])
不行声明一个 Tmp: PChar;
  Tmp :=  PChar(@UserName[1]);
  Result := Tmp
也不行我不明白Result 到底是怎么样传递出去的!按道理应该就是一个指针呀!
除了我最开始列的方法外,还有正确方法吗?

解决方案 »

  1.   

    这个问题涉及到对象的生存期问题,你的TmpName是在这个函数内部声明的,因此函数退出时,该对象也消亡了,而PChar是一个指针,如果你用后面的方法的话result指向的是一个已经消亡的地址空间,因此是不行的,所以你应该复制TmpName的值到Result自己的地址空间,这样才不会出错(就向地一种方法的一样)
      

  2.   

    对不起,上面的代码写错了!    Move(UserName[1], Result[0], 20);
        Result := TmpName;
    应该是    Move(UserName[1], TmpName[0], 20);
        Result := TmpName;   
    这样才是正确的!
    所以你的解释应该不太对!
      

  3.   

    我改了改代码
    加入了以下代码
    var
      P: Pchar
    begin
      ......
      New(p);
      Move(UserName[1], p^, 20);
      Result := P;
    end;
    这样的确成功了,所以返回的的确是指针!
    但是这样就引出了一个问题!New(p)怎么释放资源呢?显然在过程内Dispose(p)是
    不对的!
      

  4.   

    up
    另为什么要创建p呢,你直接
      Move(UserName[1], result^, 20);
    不行吗?
      

  5.   

    up
    另:为什么要创建p呢,你直接
      Move(UserName[1], result^, 20);
    不行吗?
      

  6.   

    100分又白放了!
    大家看的up两下吧!
    up有分,下午散!
      

  7.   

    p 可以不要,但 new 不能少:begin
      ......
      New(Result);
      Move(UserName[1], Result^, 20);
    end;这是一个典型的问题,Delphi 的帮助文档里都特意提到了:
    把内部的局部变量的地址,或 AnsiString 之类赋值给 PChar,作为函数结果返回,都是错误的,必须
    1. 动态分配一块空间 (new, getmem, ...)
    2. 或者把
    TmpName: array[0..19] of char;
    定义到函数外边(但是在 unit/library 里面),成为“局部的全局”变量
      

  8.   

    其实copy,move等方法都是动态创建了一块内存区域,向c++中有类似static的关键字,可以处理类似的问题,但是delphi没有,因此有两种解决的办法,一种在函数内部动态创建内存,然后在调用该函数的过程中释放该内存,还有一种就是定义一个全局变量(类似于c++的静态变量),然后每次将result指向该全局变量,则程序中就不用考虑释放内存的概念了。