我正在使用 Delphi XE2 并从 Shell32.dll 导入 SHGetFolderPath。我运行的是 Windows Vista x64。运行 SHGetFolderPathA 时结果不清楚。
即:
uses
Windows;
function SHGetFolderPath(hwnd: Cardinal; csidl: Integer; hToken: Cardinal; dwFlags: Cardinal; pszPath: PChar): Cardinal; stdcall;external 'Shell32.dll' name 'SHGetFolderPathA';
Var
Path:Array [0..MAX_PATH] of Char;
AppData:String;
begin
SHGetFolderPath(0,$001A,0,0,@path[0]);
MessageBox(0,Path,'a',0);
end.
结果是:
与使用 SHGetFolderPathW 对比:
用途 窗口;
function SHGetFolderPath(hwnd: Cardinal; csidl: Integer; hToken: Cardinal; dwFlags: Cardinal; pszPath: PChar): Cardinal; stdcall;external 'Shell32.dll' name 'SHGetFolderPathW';
Var
Path:Array [0..MAX_PATH] of Char;
AppData:String;
begin
SHGetFolderPath(0,$001A,0,0,@path[0]);
MessageBox(0,Path,'a',0);
end.
结果清楚地表明了我的 AppData 文件夹的路径,没有任何问题。
当使用 SHGetFolderPathA 在 x32 Vista 上运行相同的代码时效果很好。
如果有人能解释一下这是为什么吗?我的印象是“W”api 通常用于 Unicode 机器......?
<小时/>编辑:
我现在使用以下代码,但出现相同的错误:
uses
Windows;
function SHGetFolderPath(hwnd: HWND; csidl: Integer; hToken: THandle; dwFlags: DWord; pszPath: PAnsiChar): HRESULT; stdcall; external 'SHFolder.dll' name 'SHGetFolderPathA';
var
path: array[0..MAX_PATH] of char;
begin
SHGetFolderPath(0,$001A,0,0, @path[0]);
MessageBox(0,path,'a',0);
end.
<小时/>
最终编辑:
谢谢大家的回复。上面的 SHGetFolderPath 声明很好。在查看了所有回复并吸收了每个回复中的信息后,我得出了以下结果:
uses
Windows;
function SHGetFolderPath(hwnd: HWND; csidl: Integer; hToken: THandle; dwFlags: DWord; pszPath: PAnsiChar): HRESULT; stdcall; external 'shell32.dll' name 'SHGetFolderPathA';
var
path: array[0..MAX_PATH] of ansichar;
xRes:String;
begin
If SHGetFolderPath(0,$001A,0,0, @path[0]) = S_OK Then Begin
xRes := Path;
MessageBox(0,PWideChar(xRes),'Result',0);
End Else
MessageBox(0,'An error has occurred.','Result',0);
end.
生成的消息框正确显示我的 AppData 路径。
再次感谢您的所有回复。
最佳答案
您将 SHGetFolderPath
的最终参数声明为 PChar
类型。在 Delphi 2009 及更高版本(包括您的版本 Delphi XE2)中,PChar
是 PWideChar
的别名,但您告诉 Delphi 将您声明的函数链接到“A”版本,需要 AnsiChar
字符。
当声明对字符类型敏感的函数时,我建议根本不要使用PChar
。显式使用 PWideChar
或 PAnsiChar
。
“A”和“W”后缀与程序运行的机器无关。 所有受支持的 Windows 版本现在都是 Unicode - 最后的非 Unicode 版本是 Windows ME。 “A”和“W”指的是参数的字符类型。
至于为什么你的代码在 32 位版本的 Vista 上可以运行,而在 64 位版本上却失败,我没有解释。也许您只是幸运,操作系统做了一些转换,而这些转换恰好适合您的情况。
关于delphi - winapinameA 与 winapinameW - Unicode 与 Ansi - Delphi XE2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13168169/