2010-11-27 65 views
1

HI。請問你能幫幫我嗎。如何顯示文件列表的標準窗口「文件屬性」對話框,但文件有不同的位置? 對於前:如何顯示不同位置的多個文件的屬性對話框

d:\
d:\圖片
E:\ TEXT.TXT

我找到了一個例子,它工作正常:

function SHMultiFileProperties(pDataObj: IDataObject; Flag: DWORD): HRESULT; 
     stdcall; external 'shell32.dll'; 

function GetFileListDataObject(Files: TStrings): IDataObject; 
type 
    PArrayOfPItemIDList = ^TArrayOfPItemIDList; 
    TArrayOfPItemIDList = array[0..0] of PItemIDList; 
var 
    Malloc: IMalloc; 
    Root: IShellFolder; 
    p: PArrayOfPItemIDList; 
    chEaten, dwAttributes: ULONG; 
    i, FileCount: Integer; 
begin 
    Result := nil; 
    FileCount := Files.Count; 
    if FileCount = 0 then Exit; 

    OleCheck(SHGetMalloc(Malloc)); 
    OleCheck(SHGetDesktopFolder(Root)); 
    p := AllocMem(SizeOf(PItemIDList) * FileCount); 
    try 
    for i := 0 to FileCount - 1 do 
     try 
     if not (DirectoryExists(Files[i]) or FileExists(Files[i])) then Continue; 
     OleCheck(Root.ParseDisplayName(GetActiveWindow, 
      nil, 
      PWideChar(WideString(Files[i])), 
      chEaten, 
      p^[i], 
      dwAttributes)); 
     except 
     end; 
    OleCheck(Root.GetUIObjectOf(GetActiveWindow, 
     FileCount, 
     p^[0], 
     IDataObject, 
     nil, 
     Pointer(Result))); 
    finally 
    for i := 0 to FileCount - 1 do 
    begin 
     if p^[i] <> nil then Malloc.Free(p^[i]); 
    end; 
    FreeMem(p); 
    end; 
end; 

procedure ShowFileProperties(Files: TStrings; aWnd: HWND); 
type 
    PArrayOfPItemIDList = ^TArrayOfPItemIDList; 
    TArrayOfPItemIDList = array[0..0] of PItemIDList; 
var 
    Data: IDataObject; 
begin 
    if Files.Count = 0 then Exit; 
    Data := GetFileListDataObject(Files); 
    SHMultiFileProperties(Data, 0); 
end; 

但是,當我傳遞驅動器號,它顯示一個空的「文件屬性」對話框:

/// 
SL.Add('D:\'); 
ShowFileProperties(SL, Handle); 

我還有另一個例子:

Procedure ShowFileProperties(Const filename: String); 
Var 
sei: TShellExecuteinfo; 
Begin 
FillChar(sei,sizeof(sei),0); 
sei.cbSize := sizeof(sei); 
sei.lpFile := Pchar(filename); 
sei.lpVerb := 'Properties'; 
sei.fMask := SEE_MASK_INVOKEIDLIST; 
ShellExecuteEx(@sei); 
End; 

它還顯示「文件屬性」對話框,但不幸的是只有一個文件。在這個例子中如何傳遞不同位置的多個文件?

我還發現另一個源程序,我需要的程序,但他們需要文件位於相同的文件夾。這裏是一個鏈接:link text

+0

問問你自己,爲什麼你打擾調用`OleCheck`如果你要吃它引發的異常? – 2018-03-08 10:28:06

回答

1

我會看看代碼示例here。我想你應該能夠使用這個想法來傳遞多個文件路徑。

相關問題