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
제기 한 예외를 먹으려는 경우 'OleCheck'을 호출하는 것을 왜 귀찮게 생각합니까? –