我正在使用此函数来获取用户文件夹:
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"数组中的每个char都有#0,因此返回的字符串被截断了在开始时.
当我删除:OpenJpeg从我使用它一切都很好.
知道为什么会这样吗?
在该OpenJpeg
单元的最顶部找到此代码:
type Char = AnsiChar;
因此,在Unicode Delphi中使用时,此单元是有毒的.当你Char
在你的代码中使用时,你会期待一个WideChar
但是这个邪恶类型的别名会使你感到困惑.
我的建议是修改库删除该类型别名和替换每次使用的Char
带AnsiChar
.
如果你不想这样做,你可以完全限定Char
的System.Char
,或者使用WideChar
在代码中明确.但是,正如我所说,这个单位有毒,而且确实需要补救.
如果启用Typed-Checked Pointers编译器选项,编译器将阻止您在使用地址运算符时PAnsiChar
将a 传递给期望a的函数PWideChar
,反之亦然@
.如果可能的话,最好在编译时找到你的错误.
您可以通过path
代替来简化代码@path[0]
.
请不要使用StrPas
.它早已被弃用了.你可以简单地写
Result := path;
该数组比所需的长一个字符.也就是说,假设MaxChar
是我认为的那样.无论如何,数组应该是
path: array [0..MAX_PATH-1] of char;
您也无法对API调用执行任何错误检查.请按照文档中的说明检查错误.