2010-11-27 4 views
1

HI。私を手伝ってくれますか。どのように標準的なウィンドウを表示する "ファイルのプロパティ"ファイルの一覧のダイアログが、ファイルは異なる場所がありますか? EXの場合 :異なる場所にある複数のファイルのプロパティダイアログを表示する方法

D:
D \:\ 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; 

しかし、私は写真
E \ドライブレターを渡すと、空の「ファイルプロパティ」ダイアログが表示されます。

私は別の例を示します:

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」を呼び出すのはなぜ難しいのですか? –

答えて

1

コード例はhereです。私はあなたが複数のファイルパスを渡すためにそのアイデアを使用できるはずだと思います。

関連する問題