Форум: "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.042 c