ExtractFileDir 函数 返回驱动器和路径 
ExtractFileExt 函数 返回文件的后缀 
ExtractFileName 函数 返回文件名 

解决方案 »

  1.   

    楼上的不对哦~~~~我是ShellFolder.GetDisplayNameOf(PIDL, Flags, StrRet); 取得文件名呀得到的是一个列表吧~~~~~~~
      

  2.   

    我的这段代码可以://get item's displayname in shell
    function GetDisplayName(Parentfolder: IShellFolder; PIDL: PItemIDList;
                            Flags: DWORD): string;
    var
      StrRet: TStrRet;
    begin
      Result := '';
      if ParentFolder = nil then
      begin
        Result := 'parentfolder = nil';  { Do not localize }
        exit;
      end;
      FillChar(StrRet, SizeOf(StrRet), 0);
      ParentFolder.GetDisplayNameOf(PIDL, Flags, StrRet);
      Result := StrRetToString(PIDL, StrRet);
      { TODO 2 -oMGD -cShell Controls : Remove this hack (on Win2k, GUIDs are returned for the
    PathName of standard folders)}
      if (Pos('::{', Result) = 1) then
        Result := GetDisplayName(ParentFolder, PIDL, SHGDN_NORMAL);
    end;//convert strret structure to string
    function StrRetToString(PIDL: PItemIDList; StrRet: TStrRet; Flag:string=''): string;
    var
      P: PChar;
    begin
      case StrRet.uType of
        STRRET_CSTR:
          SetString(Result, StrRet.cStr, lStrLen(StrRet.cStr));
        STRRET_OFFSET:
          begin
            P := @PIDL.mkid.abID[StrRet.uOffset - SizeOf(PIDL.mkid.cb)];
            SetString(Result, P, PIDL.mkid.cb - StrRet.uOffset);
          end;
        STRRET_WSTR:
          if Assigned(StrRet.pOleStr) then
            Result := StrRet.pOleStr
          else
            Result := '';
      end;
      { This is a hack bug fix to get around Windows Shell Controls returning
        spurious "?"s in date/time detail fields }
      if (Length(Result) > 1) and (Result[1] = '?') and (Result[2] in ['0'..'9']) then
        Result := StringReplace(Result,'?','',[rfReplaceAll]);
    end;