![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Свойства файла [D7, WinXP]
Cj © (2007-03-08 05:04:00)Напомните пожалуйста, какие параметры надо давать EXPLORER-у для вывода свойств файла\папки. Заранее спасибо.
Rouse_ (2007-03-09 12:49:00) [21]
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Form2: TForm2;
implementation
uses
ShlObj,
ActiveX;
{$R *.dfm}
procedure ShowFileOrFolderOption(Path: String);
var
CoInit, AResult: HRESULT;
CommonDir, FileName: String;
Desktop, ShellFolder: IShellFolder;
pchEaten, Attr: Cardinal;
PathPIDL: PItemIDList;
FilePIDL: array [0..1] of PItemIDList;
M: IMAlloc;
Context: IContextMenu;
AInvokeCommand: TCMInvokeCommandInfo;
begin
// Первичная инициализация
Attr := 0;
PathPIDL := nil;
CoInit := CoInitializeEx(nil, COINIT_MULTITHREADED);
try
// Получаем пути и имя фала
CommonDir := ExtractFilePath(Path);
FileName := ExtractFileName(Path);
// Получаем указатель на интерфейс рабочего стола
if SHGetDesktopFolder(Desktop) <> S_OK then
RaiseLastOSError;
// Если работаем с папкой
if FileName = '' then
begin
// Получаем указатель на папку "Мой компьютер"
if (SHGetSpecialFolderLocation(0, CSIDL_DRIVES, PathPIDL) <> S_OK) or
(Desktop.BindToObject(PathPIDL, nil, IID_IShellFolder,
Pointer(ShellFolder)) <> S_OK) then RaiseLastOSError;
// Получаем указатель на директорию
ShellFolder.ParseDisplayName(0, nil, StringToOleStr(CommonDir),
pchEaten, FilePIDL[0], Attr);
end
else
begin
// Получаем указатель на папку "Мой компьютер"
if (Desktop.ParseDisplayName(0, nil, StringToOleStr(CommonDir),
pchEaten, PathPIDL, Attr) <> S_OK) or
(Desktop.BindToObject(PathPIDL, nil, IID_IShellFolder,
Pointer(ShellFolder)) <> S_OK) then RaiseLastOSError;
// Получаем указатель на файл
ShellFolder.ParseDisplayName(0, nil, StringToOleStr(FileName),
pchEaten, FilePIDL[0], Attr);
end;
// Получаем указатель на контектсное меню файла
AResult := ShellFolder.GetUIObjectOf(0, 1, FilePIDL[0],
IID_IContextMenu, nil, Pointer(Context));
if Succeeded(AResult) then
begin
FillMemory(@AInvokeCommand, SizeOf(AInvokeCommand), 0);
with AInvokeCommand do
begin
cbSize := SizeOf(AInvokeCommand);
hwnd := 0;
lpVerb := PChar('properties'); // строковая константа для операции над элементом...
fMask := CMIC_MASK_FLAG_NO_UI;
nShow := SW_SHOWNORMAL;
end;
// Выполнение команды...
Context.InvokeCommand(AInvokeCommand);
end;
finally
// Освобождаем занятые ресурсы чтобы небыло утечки памяти
// Для освобождения использем IMalloc
SHGetMAlloc(M);
if M <> nil then
begin
if FilePIDL[0] <> nil then
M.Free(FilePIDL[0]);
if PathPIDL <> nil then
M.Free(PathPIDL);
end;
if CoInit = S_OK then CoUninitialize;
end;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
ShowFileOrFolderOption('c:\');
ShowFileOrFolderOption('c:\1.txt');
end;
end.