// WinExec(PChar(C:\Windows\explorer.exe /n,/select, "C:\WINDOWS\abc.exe"), SW_Show);
// ShellExecute(0, nil, 'explorer.exe', '/select,C:\WINDOWS\abc.exe', nil, SW_SHOWNORMAL);
// 打开包含文件夹,并选中指定的文件
function MyOpenContainingFolder(const StrFilePath : String) : Boolean;
var
hrCoInit, hr : HResult;
pidl : PItemIDList; //PIDLIST_ABSOLUTE;
psfgaoOut: TSFGAOF;
begin
Result:=False;
hrCoInit := MySHCoInitialize(); // 在使用SHOpenFolderAndSelectItems之前调用CoInitialize或CoInitializeEx CoInitialize(nil); //
hr := SHParseDisplayName(PWideChar(WideString(StrFilePath)), //指向以零结尾的宽字符串的指针,该字符串包含要解析的显示名称。
nil, //用于控制解析操作的绑定上下文。此参数通常设置为NULL。
pidl, // 指向ITEMIDLIST类型的变量的指针的地址,该变量接收对象的项标识符列表。如果发生错误,则此参数设置为NULL。
0, // 一个ULONG值,指定要查询的属性。要查询一个或多个属性,请使用表示感兴趣属性的标志初始化此参数。
// 有关可用SFGAO标志的列表,请参阅IShellFolder :: GetAttributesOf。
psfgaoOut); // 指向ULONG的指针。返回时,设置对象为true且在sfgaoIn中请求的属性。对象的属性标志可以是零或SFGAO标志的组合。
// 将Shell命名空间对象的显示名称转换为项目标识符列表,并返回该对象的属性。
// 此函数是将字符串转换为指向项标识符列表(PIDL)的指针的首选方法。
// 文件不存在时, SUCCEEDED(hr) 不会为真
if SUCCEEDED(hr) then
begin
if SUCCEEDED(SHOpenFolderAndSelectItems(pidl,
0, // 选择数组中的项目数,apidl。如果cidl为零,则pidlFolder必须指向一个完全指定的ITEMIDLIST,
// 描述要选择的单个项目。此功能打开父文件夹并选择该项目。
nil, // 指向PIDL结构数组的指针,每个结构都是在pidlFolder引用的目标文件夹中选择的项。
0)) then // 可选标志 OFASI_EDIT OFASI_OPENDESKTOP
begin
Result:=True;
end;
CoTaskMemFree(pidl);
end;
MySHCoUninitialize(hrCoInit); //CoUninitialize();
end;