2010-11-27 4 views
1

안녕하세요. 제발 도와주세요. 어떻게 파일의 목록에 대한 표준 창 "파일 속성"대화 상자를 표시하지만 파일의 위치가 다른가요? 예를 들어 :다른 위치의 여러 파일에 대한 등록 정보 대화 상자를 표시하는 방법

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 \ 드라이브 문자를 전달하면 빈 "파일 속성"대화 상자가 표시됩니다.

/// 
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'을 호출하는 것을 왜 귀찮게 생각합니까? –

답변

1

코드 예제는 here입니다. 여러 파일 경로를 전달할 수있는 아이디어를 사용할 수 있어야한다고 생각합니다.

관련 문제