Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.02;
Скачать: CL | DM;

Вниз

Свойства файла   Найти похожие ветки 

 
Cj ©   (2007-03-08 05:04) [0]

Напомните пожалуйста, какие параметры надо давать EXPLORER-у для вывода свойств файла\папки. Заранее спасибо.


 
Rouse_ ©   (2007-03-09 12:49) [1]

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.


 
begin...end ©   (2007-03-09 13:26) [2]

А SHObjectProperties вызвать -- оно не проще будет?


 
Rouse_ ©   (2007-03-09 13:29) [3]

Там ограничение с Windows 2000 :)


 
begin...end ©   (2007-03-09 13:33) [4]

> Rouse_ ©   (09.03.07 13:29) [3]

У автора -- XP.
Ещё можно ShellExecuteEx использовать. Правда, там ограничение с Windows 3.11 :)


 
Rouse_ ©   (2007-03-09 13:41) [5]


> Ещё можно ShellExecuteEx использовать.

А это как? через lpExecInfo.lpVerb := "properties"; у меня не захотело показываться :)


 
begin...end ©   (2007-03-09 13:48) [6]

> Rouse_ ©   (09.03.07 13:41) [5]

http://groups.google.com/group/borland.public.delphi.winapi/browse_thread/thread/91038348e189930e


 
Rouse_ ©   (2007-03-09 13:53) [7]

Ясно :)
Но ты знаешь - на Windows 98 SE данный код выдает ошибку :)

var
 lpExecInfo: TShellExecuteInfo;
begin
 ZeroMemory(@lpExecInfo, SizeOf(TShellExecuteInfo));
 lpExecInfo.cbSize := SizeOf(TShellExecuteInfo);
 lpExecInfo.lpVerb := "properties";
 lpExecInfo.lpDirectory := "c:\";
 lpExecInfo.fMask := SEE_MASK_INVOKEIDLIST;
 lpExecInfo.nShow := SW_NORMAL;
 if not ShellExecuteEx(@lpExecInfo) then
   RaiseLastOSError;


 
begin...end ©   (2007-03-09 14:08) [8]

> Rouse_ ©   (09.03.07 13:53) [7]

Я сильно извиняюсь, но в коде по ссылке в [6] поле nShow не инициализируется.


 
Rouse_ ©   (2007-03-11 16:36) [9]


> begin...end ©   (09.03.07 14:08) [8]
> > Rouse_ ©   (09.03.07 13:53) [7]
>
> Я сильно извиняюсь, но в коде по ссылке в [6] поле nShow
> не инициализируется.

Я тоже сильно извиняюсь, но nShow тут вообще ни при чем :)
Ошибка абсолютно логичная и все нормально разжовано в MSDN :)
Дело в том что ShellExecuteEx на старых системах берет вербы из реестра и соответственно выполнение данного кода на отсутствующий верб "properties" для диска С:\ выдаст абсолютно нормальную ошибку о отсутствии ассоциаций.
А первый код такой ошибки не выдаст :)


 
GrayFace ©   (2007-03-11 16:56) [10]

По [1] есть вопросы:

Rouse_ ©   (09.03.07 12:49) [1]
CoInit := CoInitializeEx(nil, COINIT_MULTITHREADED);

Как я понял, IShellFolder и т.п. - это OLE, который MULTITHREADED не поддерживает.

Rouse_ ©   (09.03.07 12:49) [1]
// Получаем указатель на папку "Мой компьютер"

Зачем "Мой компьютер", а не Desktop?

Rouse_ ©   (09.03.07 12:49) [1]
Desktop.BindToObject(PathPIDL,  nil,  IID_IShellFolder, Pointer(ShellFolder))

Зачем Pointer()?

Rouse_ ©   (11.03.07 16:36) [9]
А первый код такой ошибки не выдаст :)

А если добавить OleCheck(Context.InvokeCommand(AInvokeCommand))?


 
Rouse_ ©   (2007-03-11 17:25) [11]


> Как я понял, IShellFolder и т.п. - это OLE, который MULTITHREADED
> не поддерживает.

Почему не поддерживает?


> // Получаем указатель на папку "Мой компьютер"
> Зачем "Мой компьютер", а не Desktop?

Потомучто десктопы у разных систем расположенны в разных местах :) Были кике-то там глюки, уже не упомню все...


> Desktop.BindToObject(PathPIDL,  nil,  IID_IShellFolder,
> Pointer(ShellFolder))
> Зачем Pointer()?

Потому что функция хочет четвертым параметром указатель :)
Что и указано явно.


> А первый код такой ошибки не выдаст :)
> А если добавить OleCheck(Context.InvokeCommand(AInvokeCommand))?

Да хоть обдобавляйся :)


 
begin...end ©   (2007-03-11 22:30) [12]

> Rouse_ ©   (11.03.07 16:36) [9]
> Я тоже сильно извиняюсь, но nShow тут вообще ни при чем

Ты будешь смеяться, но код [6] на Windows 98 SE прекрасно работает. А код [7] -- нет. "Найдите 10 отличий" (с)


 
Rouse_ ©   (2007-03-12 13:01) [13]


> Ты будешь смеяться, но код [6] на Windows 98 SE прекрасно
> работает.

Ты будешь смеятся, но не работает и причины ошибки я тебе уже привел.


 
begin...end ©   (2007-03-12 20:15) [14]

> Rouse_ ©   (12.03.07 13:01) [13]

У меня -- работает. Именно на Win98 SE.


 
Eraser ©   (2007-03-12 22:28) [15]

вполне может быть дело именно в SE. там довольно много отличий, по сравнению с без_SE.


 
DVM ©   (2007-03-12 23:40) [16]

function ShowFilePropertiesDialog(const Handle: HWND; const FileName: string): boolean;
const
 cProperties = "properties";
var
 Info: TShellExecuteInfo;
begin
 FillChar(Info, SizeOf(Info), #0);
 with Info do
 begin
   cbSize := SizeOf(Info);
   lpFile := PChar(FileName);
   nShow := SW_SHOW;
   fMask := SEE_MASK_INVOKEIDLIST;
   Wnd := Handle;
   lpVerb := cProperties;
 end;
 Result := ShellExecuteEx(@Info);
end;


 
Rouse_ ©   (2007-03-13 09:19) [17]


> begin...end ©   (12.03.07 20:15) [14]
> У меня -- работает. Именно на Win98 SE.


Ты на файл вызываешь диалог или на что? Я на диск С:\ пробую. На SE четко не работает. Правда у меня голый SE т.е. ни обновления браузера ни даже офиса не нем нет :)


 
begin...end ©   (2007-03-13 09:51) [18]

> Rouse_ ©   (13.03.07 09:19) [17]

> Я на диск С:\ пробую.

И я. Код такой:

uses ShellAPI;

var
 sei: TShellExecuteInfo;
begin
 FillChar(sei, SizeOf(sei), 0);
 sei.cbSize := SizeOf(sei);
 sei.lpFile := "c:\";
 sei.lpVerb := "properties";
 sei.fMask := SEE_MASK_INVOKEIDLIST;
 ShellExecuteEx(@sei);
end.


> Правда у меня голый SE т.е. ни обновления браузера ни даже
> офиса не нем нет

У меня тоже. Версия Windows 98 4.10.2222.


 
Rouse_ ©   (2007-03-13 10:36) [19]

Странно, ну ладно... будем считать что у меня что-то с виндой...


 
GrayFace ©   (2007-03-15 18:29) [20]

Rouse_ ©   (09.03.07 13:53) [7]
lpExecInfo.lpDirectory := "c:\";

begin...end ©   (13.03.07 9:51) [18]
sei.lpFile := "c:\";


 
Rouse_ ©   (2007-03-16 10:02) [21]

Ну я код то приведенный begin_end -ом использовал, где lpFile :)



Страницы: 1 вся ветка

Текущий архив: 2007.09.02;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.02 c
8-1164363431
SergeyP
2006-11-24 13:17
2007.09.02
Звуковая схема Windows


11-1168848047
MTsv DN
2007-01-15 11:00
2007.09.02
TVBeginEdit и TVEndEdit


2-1186399521
AlinaVK
2007-08-06 15:25
2007.09.02
constraint


4-1173459354
ы
2007-03-09 19:55
2007.09.02
процессор


1-1182316712
White Barsik
2007-06-20 09:18
2007.09.02
Последовательность бандов в QuickReport