发现自己这么多年是个假程序员,最基础的东西不清楚居然混了这么多年。
近期做了一个小功能,需要从动态库中返回字符串,一开始的实现是这样的:
procedure fun1(p1: pchar; var p2: pchar); stdcall;
var
str: string;
begin
str:= p1;
p2:= PChar(str+str);
end;
这样声明的话,后边的Pchar的内容(指针/地址)是可修改的(PChar的引用传递)。
但是,我想把var给去掉,弄了半天也弄不成,怎么实现呢?
百度了一下:
procedure Test(p: PChar); stdcall;
const
Title = 'Title ';
var
str: string;
begin
str := p;
StrCopy(p, Title);
StrCat(p, PChar(str));
end;
这种实现是PChar的值传递,要得到dll中的字符串,需要用到StrCopy方法,
这么多年居然没用过这个方法,很汗颜...
以为自己已经知道了,其实还差得多。
{ Getting the Windows Directory }
function GetWinDir: string;
var
dir: array [0..MAX_PATH] of Char;
begin
GetWindowsDirectory(dir, MAX_PATH);
Result := StrPas(dir);
end;
// or:
function WindowsDirectory: string;
var
WinDir: PChar;
begin
WinDir := StrAlloc(MAX_PATH);
GetWindowsDirectory(WinDir, MAX_PATH);
Result := string(WinDir);
if Result[Length(Result)] <> '\' then
Result := Result + '\';
StrDispose(WinDir);
end;
// or:
function GetWindowsDirectory(var S: String): Boolean;
var
Len: Integer;
begin
Len := Windows.GetWindowsDirectory(nil, 0);
if Len > 0 then
begin
SetLength(S, Len);
Len := Windows.GetWindowsDirectory(PChar(S), Len);
SetLength(S, Len);
Result := Len > 0;
end else
Result := False;
end;