type BROWSEINFO = record hOwner : cardinal; pidlRoot : cardinal; pszDisplayName : string; lpszTitle : string; ulFlags : cardinal; lpfn : cardinal; lParam : cardinal; iImage : cardinal; end; var AppDirPage, ServerDirPage: TInputDirWizardPage; function SHGetPathFromIDList(pidl : cardinal; pszPath : string): cardinal; external 'SHGetPathFromIDListA@shell32.dll stdcall'; function SHBrowseForFolder(var lpBrowseInfo: BROWSEINFO): cardinal; external 'SHBrowseForFolderA@shell32.dll stdcall'; procedure CoTaskMemFree(pv : cardinal); external 'CoTaskMemFree@ole32.dll stdcall'; const MAX_PATH = 260; BIF_RETURNONLYFSDIRS = $1; procedure OnNetworkButtonClick(Sender: TObject); var bi : BROWSEINFO; pidl : cardinal; path : string; begin // initialise the BROWSEINFO structure bi.hOwner := WizardForm.Handle; bi.lpszTitle := WizardForm.PAGEDESCRIPTIONLABEL.Caption; bi.ulFlags := BIF_RETURNONLYFSDIRS; // call the browse folder dialog pidl := SHBrowseForFolder(bi); if pidl <> 0 then begin try // check if we got back a valid PIDL path := StringOfChar(' ', MAX_PATH); if SHGetPathFromIDList(pidl, path) = 1 then begin // if so then poke the path back into the select directory edit box ServerDirPage.Values[0] := path; end; finally // clean up CoTaskMemFree(pidl); end; end; end; function GetServerDir(Param: String): String; begin { Return the selected DataDir } Result := ServerDirPage.Values[0]; end;