gpt4 book ai didi

windows - 如何在 Pascal Script/Inno Setup 中使用 WinAPI 中的 PathCombine()?

转载 作者:可可西里 更新时间:2023-11-01 10:35:07 27 4
gpt4 key购买 nike

我正在尝试了解如何使用 Pascal Script/Inno Setup 中的 WinAPI 函数。我没有找到太多代码示例如何去做,而且我不是 Pascal 程序员。这是我到目前为止所做的:

导入函数

function PathCombine (
pszPathOut : PChar;
pszPathIn : PChar;
pszMore : PChar
) : PChar;
external 'PathCombineA@Shlwapi.dll stdcall';

并像这样使用它:

function InitializeSetup(): Boolean;
var
a, b,c : PChar;
s : string;
begin
SetLength(s, 256); { soon it gets working I'll switch to use MAX_PATH instead of }
a := 'C:';
b := 'one\two';
c := PathCombine(s, a, b);
MsgBox(s, mbInformation, MB_OK);
end;

输出是这样的:

enter image description here

预期的输出是:

C:\one\two

我很确定我正在访问内存中的垃圾值,但我不知道为什么,我该如何解决这个问题?

最佳答案

您没有指定您使用的是 Ansi 还是 Unicode 版本的 Inno Setup。

但这应该适用于任何一个版本:

function PathCombine(
pszPathOut : PAnsiChar;
pszPathIn : PAnsiChar;
pszMore : PAnsiChar
) : PAnsiChar; external 'PathCombineA@Shlwapi.dll stdcall';

function InitializeSetup(): Boolean;
var
a, b, c: AnsiString;
begin
SetLength(c, 256); { soon it gets working I'll switch to use MAX_PATH instead of }
a := 'C:';
b := 'one\two';
PathCombine(c, a, b);
MsgBox(c, mbInformation, MB_OK);
Result := True;
end;

尽管我强烈建议您使用 Unicode version of Inno SetupPathCombineW 代替。

function PathCombine(
pszPathOut : string;
pszPathIn : string;
pszMore : string
) : Cardinal; external 'PathCombineW@Shlwapi.dll stdcall';

function InitializeSetup(): Boolean;
var
a, b, c: string;
begin
SetLength(c, 256); { soon it gets working I'll switch to use MAX_PATH instead of }
a := 'C:';
b := 'one\two';
PathCombine(c, a, b);
MsgBox(c, mbInformation, MB_OK);
Result := True;
end;

请注意 Inno Setup 缺少 PWideChar 类型。虽然它可以将 string 编码为 LPTSTR (PWideChar) 函数参数,但它不能将 LPTSTR 返回值编码。所以我使用 Cardinal 作为返回类型。它与指针(指向 char)具有相同的大小,因此堆栈将匹配。我们实际上并不需要返回值。

关于windows - 如何在 Pascal Script/Inno Setup 中使用 WinAPI 中的 PathCombine()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31666876/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com