Windows 如何在Pascal脚本/Inno设置中使用WinAPI中的PathCombine()?
我正在尝试从Pascal脚本/Inno设置中找出如何使用WinAPI函数。我找不到太多的代码示例,也不是Pascal程序员。以下是我到目前为止所做的: 导入函数Windows 如何在Pascal脚本/Inno设置中使用WinAPI中的PathCombine()?,windows,winapi,inno-setup,pascalscript,Windows,Winapi,Inno Setup,Pascalscript,我正在尝试从Pascal脚本/Inno设置中找出如何使用WinAPI函数。我找不到太多的代码示例,也不是Pascal程序员。以下是我到目前为止所做的: 导入函数 函数路径组合( pszPathOut:PChar; pszPathIn:PChar; pszMore:PChar ):PChar; 外部的PathCombineA@Shlwapi.dllstdcall'; 然后像这样使用它: PathCombine(s, a, b); 函数InitializeSetup():布尔值; 变量 a、 b
函数路径组合(
pszPathOut:PChar;
pszPathIn:PChar;
pszMore:PChar
):PChar;
外部的PathCombineA@Shlwapi.dllstdcall';
然后像这样使用它:
PathCombine(s, a, b);
函数InitializeSetup():布尔值;
变量
a、 b,c:PChar;
s:字符串;
开始
设定长度(s,256);{很快它就开始工作了,我将切换到使用MAX_PATH而不是}
a:=“C:”;
b:=“一\二”;
c:=路径组合(s、a、b);
MsgBox(s,mbInformation,MB_OK);
结束;
输出如下:
预期产出为:
C:\1\2
我很确定我正在访问内存中的垃圾值,但我不知道为什么,我该如何解决这个问题?我认为(尽管我有一段时间没有使用Pascal/Delphi),问题是C“字符串”(char*
)是基于索引的0,而Pascal字符串是基于索引的1(字节0用于存储长度)
因此,如果您将s
变量声明为:
s: array[0..255] of Char; //Don't forget to change it to MAX_PATH afterwards
它应该可以工作。还可以像这样使用PathCombine
功能:
PathCombine(s, a, b);
无需将其结果(与
s
相同)分配给另一个变量(您无论如何都不会使用该变量)。您没有指定是使用Ansi还是Unicode版本的Inno Setup
但这两种版本都适用:
函数路径组合(
pszPathOut:PAnsiChar;
pszPathIn:PAnsiChar;
pszMore:PAnsiChar
):PAnsiChar;外部'PathCombineA@Shlwapi.dllstdcall';
函数InitializeSetup():Boolean;
变量
a、 b,c:翻译;
开始
SetLength(c,256){很快它就开始工作了,我将切换到使用MAX_路径而不是}
a:=“C:”;
b:=“一\二”;
路径组合(c、a、b);
MsgBox(c,mbInformation,MB_OK);
结果:=真;
结束;
尽管我强烈建议您使用and
PathCombineW
函数路径组合(
pszPathOut:字符串;
pszPathIn:字符串;
pszMore:字符串
):基数;外部'PathCombineW@Shlwapi.dllstdcall';
函数InitializeSetup():Boolean;
变量
a、 b,c:弦;
开始
SetLength(c,256){很快它就开始工作了,我将切换到使用MAX_路径而不是}
a:=“C:”;
b:=“一\二”;
路径组合(c、a、b);
MsgBox(c,mbInformation,MB_OK);
结果:=真;
结束;
请注意,Inno安装程序缺少
PWideChar
类型。虽然它可以将string
封送到LPTSTR
(PWideChar
)函数参数,但它无法封送LPTSTR
返回值。因此我对返回类型使用了Cardinal
。它的大小与指针(到char)相同,因此堆栈将匹配。我们实际上不需要返回值。Pascal脚本可以以本机方式将字符串
封送到PChar
。因此基本索引不是核心问题。(当然,您的替代代码是正确的。)那么我说的有什么不正确的吗?转换是在没有显式强制转换的情况下进行的吗?是的,转换是自动进行的。