Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何在Pascal脚本/Inno设置中使用WinAPI中的PathCombine()?_Windows_Winapi_Inno Setup_Pascalscript - Fatal编程技术网

Windows 如何在Pascal脚本/Inno设置中使用WinAPI中的PathCombine()?

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

我正在尝试从Pascal脚本/Inno设置中找出如何使用WinAPI函数。我找不到太多的代码示例,也不是Pascal程序员。以下是我到目前为止所做的:

导入函数

函数路径组合(
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
。因此基本索引不是核心问题。(当然,您的替代代码是正确的。)那么我说的有什么不正确的吗?转换是在没有显式强制转换的情况下进行的吗?是的,转换是自动进行的。