![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Свойства файла [D7, WinXP]
Cj © (2007-03-08 05:04:00)Напомните пожалуйста, какие параметры надо давать EXPLORER-у для вывода свойств файла\папки. Заранее спасибо.
Rouse_ (2007-03-16 10:02:00) [1]Ну я код то приведенный begin_end -ом использовал, где lpFile :)
GrayFace (2007-03-15 18:29:00) [2]Rouse_ © (09.03.07 13:53) [7]
lpExecInfo.lpDirectory := 'c:\';
begin...end © (13.03.07 9:51) [18]
sei.lpFile := 'c:\';
Rouse_ (2007-03-13 10:36:00) [3]Странно, ну ладно... будем считать что у меня что-то с виндой...
begin...end (2007-03-13 09:51:00) [4]> 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 09:19:00) [5]
> begin...end © (12.03.07 20:15) [14]
> У меня -- работает. Именно на Win98 SE.
Ты на файл вызываешь диалог или на что? Я на диск С:\ пробую. На SE четко не работает. Правда у меня голый SE т.е. ни обновления браузера ни даже офиса не нем нет :)
DVM (2007-03-12 23:40:00) [6]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;
Eraser (2007-03-12 22:28:00) [7]вполне может быть дело именно в SE. там довольно много отличий, по сравнению с без_SE.
begin...end (2007-03-12 20:15:00) [8]> Rouse_ © (12.03.07 13:01) [13]
У меня -- работает. Именно на Win98 SE.
Rouse_ (2007-03-12 13:01:00) [9]
> Ты будешь смеяться, но код [6] на Windows 98 SE прекрасно
> работает.
Ты будешь смеятся, но не работает и причины ошибки я тебе уже привел.
begin...end (2007-03-11 22:30:00) [10]> Rouse_ © (11.03.07 16:36) [9]
> Я тоже сильно извиняюсь, но nShow тут вообще ни при чем
Ты будешь смеяться, но код [6] на Windows 98 SE прекрасно работает. А код [7] -- нет. "Найдите 10 отличий" (с)
Rouse_ (2007-03-11 17:25:00) [11]
> Как я понял, IShellFolder и т.п. - это OLE, который MULTITHREADED
> не поддерживает.
Почему не поддерживает?
> // Получаем указатель на папку "Мой компьютер"
> Зачем "Мой компьютер", а не Desktop?
Потомучто десктопы у разных систем расположенны в разных местах :) Были кике-то там глюки, уже не упомню все...
> Desktop.BindToObject(PathPIDL, nil, IID_IShellFolder,
> Pointer(ShellFolder))
> Зачем Pointer()?
Потому что функция хочет четвертым параметром указатель :)
Что и указано явно.
> А первый код такой ошибки не выдаст :)
> А если добавить OleCheck(Context.InvokeCommand(AInvokeCommand))?
Да хоть обдобавляйся :)
GrayFace (2007-03-11 16:56:00) [12]По [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 16:36:00) [13]
> begin...end © (09.03.07 14:08) [8]
> > Rouse_ © (09.03.07 13:53) [7]
>
> Я сильно извиняюсь, но в коде по ссылке в [6] поле nShow
> не инициализируется.
Я тоже сильно извиняюсь, но nShow тут вообще ни при чем :)
Ошибка абсолютно логичная и все нормально разжовано в MSDN :)
Дело в том что ShellExecuteEx на старых системах берет вербы из реестра и соответственно выполнение данного кода на отсутствующий верб 'properties' для диска С:\ выдаст абсолютно нормальную ошибку о отсутствии ассоциаций.
А первый код такой ошибки не выдаст :)
begin...end (2007-03-09 14:08:00) [14]> Rouse_ © (09.03.07 13:53) [7]
Я сильно извиняюсь, но в коде по ссылке в [6] поле nShow не инициализируется.
Rouse_ (2007-03-09 13:53:00) [15]Ясно :)
Но ты знаешь - на 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 13:48:00) [16]> 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:41:00) [17]
> Ещё можно ShellExecuteEx использовать.
А это как? через lpExecInfo.lpVerb := 'properties'; у меня не захотело показываться :)
begin...end (2007-03-09 13:33:00) [18]> Rouse_ © (09.03.07 13:29) [3]
У автора -- XP.
Ещё можно ShellExecuteEx использовать. Правда, там ограничение с Windows 3.11 :)
Rouse_ (2007-03-09 13:29:00) [19]Там ограничение с Windows 2000 :)
begin...end (2007-03-09 13:26:00) [20]А SHObjectProperties вызвать -- оно не проще будет?