私は 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 を使用する場合と比較:
Windows を使用します。
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 パスへのパスが正しく表示されます。
すべての回答に感謝します。