我正在使用此功能获取用户文件夹:
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 从我使用它一切正常。
知道为什么会这样吗?
答案 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调用执行任何错误检查。请按照文档中的说明检查错误。