- Get a handle to IFileDialog from a TFileDialogEvent to get the filename
- function TFileDialogEvent.OnButtonClicked(const pfdc: IFileDialogCustomize;
- dwIDCtl: DWORD): HResult; stdcall;
- var
- iImageEnIO: TImageEnIO;
- iFilename: string;
- iName: PChar;
- pfd: IFileDialog;
- begin
- if dwIDCtl = dwVisualGroup8ID then
- begin
- iImageEnIO := TImageEnIO.Create(nil);
- try
- FileDialog.QueryInterface(
- StringToGUID('{8016B7B3-3D49-4504-A0AA-2A37494E606F}'),
- pfd);
- // How to get correct valid handle to IFileDialog?
- pfd.GetFileName(iName);
- iFilename := string(iName);
- if FileExists(iFilename) then
- begin
- function TFileDialogEvent.OnButtonClicked(const pfdc: IFileDialogCustomize;
- dwIDCtl: DWORD): HResult; stdcall;
- var
- iImageEnIO: TImageEnIO;
- iFilename: string;
- pFolder: PWideChar;
- iFolder: string;
- iName: PChar;
- pfd: IFileDialog;
- hr: HRESULT;
- aShellItem: IShellItem;
- begin
- if dwIDCtl = dwVisualGroup8ID then
- begin
- iImageEnIO := TImageEnIO.Create(nil);
- try
- FileDialog.QueryInterface(IFileDialog, pfd);
- pfd.GetFileName(iName);
- // Get the ShellItem
- hr := SHCreateItemFromParsingName(iName, nil,
- StringToGUID(SID_IShellItem), aShellItem);
- // Get the folder
- pfd.GetFolder(aShellItem);
- // Get the folder displayname
- aShellItem.GetDisplayName(SIGDN_FILESYSPATH, pFolder);
- iFolder := string(pFolder);
- if DirectoryExists( iFolder) then
- iFilename := IncludeTrailingPathDelimiter( iFolder) + string(iName);
- if FileExists(iFilename) then
- begin
- FileDialog.QueryInterface(IFileDialog, pfd);
- pfd := FileDialog as IFileDialog;
- if Supports(FileDialog, IFileDialog, pfd) then ...
- function TFileDialogEvent.OnButtonClicked(const pfdc: IFileDialogCustomize; dwIDCtl: DWORD): HResult; stdcall;
- var
- iImageEnIO: TImageEnIO;
- iFilename: string;
- iName: PWideChar;
- begin
- if dwIDCtl <> dwVisualGroup8ID then
- Result := E_NOTIMPL
- else
- begin
- Result := S_OK;
- if FAILED(Self.Dialog.GetFileName(iName)) then Exit;
- try
- iFilename := string(iName);
- finally
- CoTaskMemFree(iName);
- end;
- iImageEnIO := TImageEnIO.Create(nil);
- try
- if FileExists(iFilename) then
- begin
- ...
- end;
- finally
- iImageEnIO.Free;
- end;
- end;
- end;