![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как программно открыть "Мой компьютер"? [D7, WinXP]
gdaujk © (2006-12-04 12:09:00)Доброго времени суток. Вопрос в теме. Делаю так:
explorer /select, C:\
Подозреваю, что есть другой вариант :-)
TUser (2006-12-04 18:00:00) [1]В ХР выполнить команду '...';
Leonid Troyanovsky (2006-12-04 16:08:00) [2]
> gdaujk © (04.12.06 16:00) [19]
Да, только в [16] еще нужно
try ExecPidl finally CoTaskFreeMem
--
Regards, LVT.
gdaujk (2006-12-04 16:00:00) [3]
> Leonid Troyanovsky © (04.12.06 15:53) [18]
Точно:
When using Microsoft Windows 2000 or later, use CoTaskMemFree rather than ILFree. ITEMIDLIST structures are always allocated with the Component Object Model (COM) task allocator on those platforms.
Ещё раз спасибо.
Leonid Troyanovsky (2006-12-04 15:53:00) [4]
> gdaujk © (04.12.06 15:34) [17]
> Самое то, что нужно. Спасибо. Только вопросик: зачем CotaskMemFree?
RTFM: msdn: SHGetSpecialFolderLocation Function
ppidl
[out] A pointer to an item identifier list (PIDL) specifying the folder's location relative to the root of the namespace (the desktop). The calling application is responsible for freeing this pointer with the Shell's IMalloc interface (see SHGetMalloc).
Т.е., IMalloc.Free. Ну, или другим способом, скажем CoTaskMemFree.
--
Regards, LVT.
gdaujk (2006-12-04 15:34:00) [5]
> Leonid Troyanovsky © (04.12.06 15:18) [16]
Самое то, что нужно. Спасибо. Только вопросик: зачем CotaskMemFree?
Leonid Troyanovsky (2006-12-04 15:18:00) [6]
> gdaujk © (04.12.06 14:11) [3]
> Подозреваю, что есть другой вариант: программа XXX, например,
> тоже запускает Explorer - "Мой компьютер", только C:\
> не выделяется (как это происходит в выше описанном варианте)
uses shlobj, ActiveX, ShellApi;
procedure ExecPidl(pidl: Pointer; verb: String);
var
ExeInfo: TShellExecuteInfo;
begin
FillChar(ExeInfo, SizeOf(ExeInfo), 0);
with ExeInfo do
begin
cbSize := SizeOf(ExeInfo);
fMask := SEE_MASK_INVOKEIDLIST;
lpVerb := Pointer(verb);
nShow := SW_NORMAL;
lpIdList := pidl;
end;
Win32Check(ShellExecuteEx(@ExeInfo));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
pidl: PItemIDList;
begin
Win32Check(SHGetSpecialFolderLocation(0, CSIDL_DRIVES, pidl) = S_OK);
ExecPidl(pidl, 'open');
CotaskMemFree(pidl);
end;
--
Regards, LVT.
zdm (2006-12-04 15:14:00) [7]
> gdaujk © (04.12.06 15:10) [14]
Не заморачивайся, решение предложено нормальное, а уж как там себя ведет вызваный API, да какая разница. ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}'-это ключ реестра, в HKEY_CLASSESS_ROOT и зарегестрирован системой по умолчанию как "мой комп.", вот ShellExecute и обращается к нему
gdaujk (2006-12-04 15:10:00) [8]
> Steep © (04.12.06 15:02) [12]
Что есть "папку мого компьютера"?
umbra (2006-12-04 15:09:00) [9]
> '::{20D04FE0-3AEA-1069-A2D8-08002B30309D}'
это моникер (аналог пути к файлу в СОМ). Судя по кол-ву двоеточий (это разделитель частей), он должен состоять из 3-х частей. Две первые не указаны и, наверное, берутся значения по умолчанию. Последняя - это GUID папки "Мои документы". Если поискать это значение в реестре, то можно узнать, что на самом деле открывается файл C:\WINDOWS\web\mycomp.htt
Steep (2006-12-04 15:02:00) [10]или попробуй
ShellExecute(Self.Handle,'explore',%systemroot%',nil,nil,SW_SHOWNORMAL);
ps. если получиться токо вместо %systemroot% (системная папка), нужно ввести папку мого компьютера
zdm (2006-12-04 15:01:00) [11]запусти regedit-поиск(20D04FE0-3AEA-1069-A2D8-08002B30309D) это и есть "мой комп"
Anatoly Podgoretsky (2006-12-04 15:01:00) [12]> gdaujk (04.12.2006 14:11:03) [3]
> Вы думаете, что я прямо так и пишу:
Именно так ты и написал.
gdaujk (2006-12-04 14:57:00) [13]
> zdm © (04.12.06 14:54) [7]
Не могли бы вы пояснить, что такое "реестр вызова" ?
gdaujk (2006-12-04 14:55:00) [14]>>zdm © (04.12.06 14:52) [5]
только так могу предложить, откроется мой комп. но установленый на диск с:\
ShellExecute(Self.Handle,'explore','c:\',nil,nil,SW_SHOWNORMAL);
Ваш вариант просто открывает C:\.
zdm (2006-12-04 14:54:00) [15]
> gdaujk © (04.12.06 14:52) [6]
круто!!! похоже есть ссылка на реестр вызова именно "мой комп."
gdaujk (2006-12-04 14:52:00) [16]>>Steep © (04.12.06 14:46) [4]
Просто explore открывает неизвестно что :-)
Нашёл вариант:
ShellExecute(Handle, nil, '::{20D04FE0-3AEA-1069-A2D8-08002B30309D}', nil,nil,SW_SHOWNORMAL);
Может кто объяснит, как это робит?
zdm (2006-12-04 14:52:00) [17]
> Steep © (04.12.06 14:46) [4]
так он выйдет на путь откуда запущено приложение.
только так могу предложить, откроется мой комп. но установленый на диск с:\
ShellExecute(Self.Handle,'explore','c:\',nil,nil,SW_SHOWNORMAL);
Steep (2006-12-04 14:46:00) [18]не помню точно
попробуй
ShellExecute(Self.Handle,' explore',nil,nil,nil,SW_SHOWNORMAL);
или
напиши ShellExecute + f1, там где-то написаны параметры..
gdaujk (2006-12-04 14:11:00) [19]>>Anatoly Podgoretsky © (04.12.06 12:34) [1]
Вы думаете, что я прямо так и пишу:
begin
explorer /select, C:\
end;
???
>>zdm
Простите, вы читать умеете? Написано же: "Мой компьютер". При чём тут ваше
ShellExecute(Self.Handle,'open','c:\',nil,nil,SW_SHOWNORMAL);
???
Перефразирую вопрос. Делаю так:
ShellExecute(Self.Handle, nil,'explorer', '/select, C:\',nil,SW_SHOWNORMAL);
(то же, чтоexplorer /select, C:\)
Подозреваю, что есть другой вариант: программа XXX, например, тоже запускает Explorer - "Мой компьютер", только C:\ не выделяется (как это происходит в выше описанном варианте)
PS: Ещё раз повторю: Explorer должен показать не C:\, не "Мои документы", не что быто ни было ещё, а "МОЙ КОМПЬЮТЕР"...
zdm (2006-12-04 12:59:00) [20]uses .... ShellApi ....
ShellExecute(Self.Handle,'open','c:\',nil,nil,SW_SHOWNORMAL);