以下是我写的一个函数,我把放在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 到底是怎么样传递出去的!按道理应该就是一个指针呀!
除了我最开始列的方法外,还有正确方法吗?
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 到底是怎么样传递出去的!按道理应该就是一个指针呀!
除了我最开始列的方法外,还有正确方法吗?
Result := TmpName;
应该是 Move(UserName[1], TmpName[0], 20);
Result := TmpName;
这样才是正确的!
所以你的解释应该不太对!
加入了以下代码
var
P: Pchar
begin
......
New(p);
Move(UserName[1], p^, 20);
Result := P;
end;
这样的确成功了,所以返回的的确是指针!
但是这样就引出了一个问题!New(p)怎么释放资源呢?显然在过程内Dispose(p)是
不对的!
另为什么要创建p呢,你直接
Move(UserName[1], result^, 20);
不行吗?
另:为什么要创建p呢,你直接
Move(UserName[1], result^, 20);
不行吗?
大家看的up两下吧!
up有分,下午散!
......
New(Result);
Move(UserName[1], Result^, 20);
end;这是一个典型的问题,Delphi 的帮助文档里都特意提到了:
把内部的局部变量的地址,或 AnsiString 之类赋值给 PChar,作为函数结果返回,都是错误的,必须
1. 动态分配一块空间 (new, getmem, ...)
2. 或者把
TmpName: array[0..19] of char;
定义到函数外边(但是在 unit/library 里面),成为“局部的全局”变量