shgetpathfromidlist(pidl, pchar(str));
str := pchar(str);
caption := str;
cotaskmemfree(pidl);
end;
end;
shbrowseforfolder返回一个lpitemidlist,你需要手动将它转换成一个实际的文件路径(除非你选择的是回收站和控制面板这样的虚拟路径)。最后还要用shell api把获得的pidl释放。上述代码中,browsecallback是一个自己编写的回调函数,如果不想处理回调的话,可以将它设置为nil。我还是处理了这个函数,因为我需要它的一些功能,如下:
function browsecallback(awnd:hwnd; umsg:uint; lp, lpdata:lparam):integer; stdcall;
var
strpath : string;
pidl : pitemidlist;
begin
case umsg of
bffm_selchanged:
begin
pidl := pitemidlist(lp);
if pidl<>nil then begin
setlength(strpath, max_path);
shgetpathfromidlist(pidl, pchar(strpath));
strpath := pchar(strpath);
strpath := 'folder selected: ' + strpath;