Delphi SHGetFolderPath和null终止字符串

时间:2015-12-14 21:56:37

标签: 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;

工作得很好。 但是在我将这个lib添加到我的项目之后: OpenJpeg 此函数返回的值为:C。似乎由于某种原因," path"数组后面有#0,因此返回的字符串在开头就被截断了。

当我删除: OpenJpeg 从我使用它一切正常。

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:7)

OpenJpeg单元的最顶部找到此代码:

type
  Char = AnsiChar;

因此在Unicode Delphi中使用时,此单元有毒。当您在代码中使用Char时,您期望WideChar,但这种邪恶类型的别名会让您感到困惑。

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

如果您不想这样做,则可以将Char完全限定为System.Char,或在代码中明确使用WideChar。但是,正如我所说,这个单位有毒,而且确实需要补救。

如果启用Typed-Checked Pointers编译器选项,编译器将阻止您在使用PAnsiChar时将PWideChar传递给期望@的函数,反之亦然地址运算符。如果可能的话,最好在编译时找到你的错误。

您可以通过path代替@path[0]来简化代码。

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

Result := path;

数组长度超过必要的一个字符。也就是说,假设MaxChar是我认为的那样。无论如何,数组应该是

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

您也无法对API调用执行任何错误检查。请按照文档中的说明检查错误。