[編集]
function PathFromShellItem(AShellItem: IShellItem): string;
{Helper function to get path from ShellItem}
var
hr: HRESULT;
iPath: PWideChar;
begin
hr := AShellItem.GetDisplayName(SIGDN_FILESYSPATH, iPath);
if hr = 0 then
Result := iPath
else
Result := '';
end;
以下のコードは、IShellItem からフォルダー名とファイル名を取得しようとします。ファイル名 (iName) は正しく取得されますが、フォルダー名 (iFolder) は常に "" です。pfd.GetFolder がフォルダー名を返さないのはなぜですか? フォルダ名を間違った方法で取得しようとしていますか?
function TFileDialogEvent.OnSelectionChange(const pfd: IFileDialog): HResult; stdcall;
{Handle the OnSelectionChange event and fill labels with information}
var
ShellItem: IShellItem;
iFilename: string;
iFolder: string;
iName: PWideChar;
begin
if pfd.GetFolder(ShellItem) = S_OK then
iFolder := PathFromShellItem(ShellItem);
OleCheck(pfd.GetFileName(iName));
{Set the filepath}
if DirectoryExists(iFolder) then
iFilename := IncludeTrailingPathDelimiter(iFolder) + string(iName);
end;