Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.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
Delphi SHGetFolderPath和以null结尾的字符串_Delphi - Fatal编程技术网

Delphi SHGetFolderPath和以null结尾的字符串

Delphi SHGetFolderPath和以null结尾的字符串,delphi,Delphi,我正在使用此功能获取用户文件夹: function LocalAppDataPath : string; const SHGFP_TYPE_CURRENT = 0; var path: array [0..MaxChar] of char; begin SHGetFolderPath(0,CSIDL_LOCAL_APPDATA,0,SHGFP_TYPE_CURRENT,@path[0]); Result := StrPas(path); end; 它工作得很好。 但是在我将这个

我正在使用此功能获取用户文件夹:

function LocalAppDataPath : string;
const
  SHGFP_TYPE_CURRENT = 0;
var
  path: array [0..MaxChar] of char;
begin
  SHGetFolderPath(0,CSIDL_LOCAL_APPDATA,0,SHGFP_TYPE_CURRENT,@path[0]);
  Result := StrPas(path);
end;
它工作得很好。 但是在我将这个库添加到我的项目之后:OpenJpeg 此函数返回的值为:C。出于某种原因,“path”数组中的每个字符后面都有#0,因此返回的字符串在开头就被截断了

当我将:OpenJpeg从我的应用程序中删除时,一切正常


知道为什么会发生这种情况吗?

在OpenJpeg单元的最顶端可以找到以下代码:

type
  Char = AnsiChar;
因此,在Unicode Delphi中使用此单元时会产生毒性。当您在代码中使用
Char
时,您希望看到一个
WideChar
,但这种邪恶类型的别名让您感到困惑

我的建议是修改库以删除该类型别名,并将每次使用
Char
替换为
AnsiChar

如果不想这样做,可以将
Char
完全限定为
System.Char
,或者在代码中明确使用
WideChar
。然而,正如我所说的,这个装置是有毒的,它确实需要补救

如果启用编译器选项,则在使用
@
地址运算符时,编译器将阻止您将
PAnsiChar
传递给需要
PWideChar
的函数,反之亦然。如果可能的话,最好在编译时发现错误

您可以通过传递
路径
而不是
@path[0]
来简化代码

请不要使用StrPas。它早就被弃用了。你可以简单地写

Result := path;
数组比所需长度长一个字符。也就是说,假设
MaxChar
就是我所认为的那样。无论如何,数组应该是

path: array [0..MAX_PATH-1] of char;

您也无法对API调用执行任何错误检查。请检查文档中描述的错误

SHGetFolderPath不推荐使用。您可以尝试使用Unicode和ANSI名称
SHGetFolderPathW()
(Unicode)和
SHGetFolderPathA()
(ANSI)。我们也看不到您的delphi版本。@moskito-x:
ShGetFolderPath
映射到W或A版本,具体取决于delphi的版本,即是否为“Unicode”。它没有被弃用。但显然,OpenJPeg本身的导入会把事情弄得一团糟。您不需要首先使用
@
地址操作符。将
@path[0]
替换为
path
,编译器仍将检测到任何类型不匹配错误。感谢您给出了非常好的答案,这是对该问题的完全合乎逻辑的解释。但是,由于某种原因,它仍然不起作用。我将函数更改为:ShlObj.SHGetFolderPath(0,CSIDL_LOCAL_APPDATA,0,SHGFP_TYPE_CURRENT,@path);。“路径”前的“@”仍然需要,返回的数组仍然存在#0问题。是否启用了类型检查指针?也许实际发生的是
char
被重新定义。记住,你可以看到另一个单位,我们不能。你看了吗?你需要@这个事实告诉我有一个类型不匹配。编译器会告诉你的。但是您没有告诉我们错误消息,然后您将其抑制。当编译器告诉您您的类型不匹配时,您应该注意。是的,OpenJpeg以一种绝望的方式重新定义了字符。写那个图书馆的人有点不知所措。我敦促你们注意我回答中的每一条建议。