Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.044 c
15-1186068053
Kenifer
2007-08-02 19:20
2007.09.02
Как сделать чтоб программа сохраняла файл!


4-1173254885
C@N
2007-03-07 11:08
2007.09.02
Как пронюхать "протокол" железяки работающей через COM1


15-1186486501
@!!ex
2007-08-07 15:35
2007.09.02
Как скролить RichEdit


2-1186039851
Xmen
2007-08-02 11:30
2007.09.02
проблема с OraSQL.ParamByName


15-1186512073
Loginov Dmitry
2007-08-07 22:41
2007.09.02
Баг в Delphi (от 7 до 2007) с условной компиляцией





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский