delphi - winapinameA 与 winapinameW - Unicode 与 Ansi - Delphi XE2

标签 delphi winapi unicode delphi-xe2 ansi

我正在使用 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.

结果是:

enter image description here

与使用 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)中,PCharPWideChar 的别名,但您告诉 Delphi 将您声明的函数链接到“A”版本,需要 AnsiChar 字符。

当声明对字符类型敏感的函数时,我建议根本不要使用PChar。显式使用 PWideCharPAnsiChar

“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/

相关文章:

windows - 如何检测 Delpi 代码是否在 DLL 中运行?

delphi - Delphi中MainForm的OnShow事件中的ExitProcess

对于单个 Unicode 字符串,Python 返回长度为 2

python - python 中处理 unicode 字符的问题

c - 在 C 中检索 Windows 进程的完整列表

python - 如何使用python从unicode转换

c++ - 将 C++ 回调函数转换为 Delphi

delphi - 绕过 Delphi 7 中的 OutputDebugString?

winapi - 为什么我的服务在 Vista 上的 DebugBreak() 处崩溃?

python - 如何在 Windows 上获取总磁盘大小?