CoCreateinstance & IOleCommandTarget and etc.

Обсуждение вопросов, касающихся указанной технологии.
Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

CoCreateinstance & IOleCommandTarget and etc.

Сообщение Alexanbar » 06.04.2009 (Пн) 12:03

Как это все использовать на VB6?

Исходные данные: ЕСть CLSID (читается из реестра в виде строки).

С помощью CoCreateinstance нужно получить доступ к интерефейсу IOleCommandTarget, где задействовать метод Exec.

Ну и хотелось бы знать, когда созданный объект уничтожить (и надо ли).

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: CoCreateinstance & IOleCommandTarget and etc.

Сообщение Хакер » 06.04.2009 (Пн) 13:13

Ну и хотелось бы знать, когда созданный объект уничтожить (и надо ли).

Объект сам уничтожится, когда счётчик ссылок достигнет нуля. Твоя ответственность лишь в своевременных вызоваз AddRef/Release.

Исходные данные: ЕСть CLSID (читается из реестра в виде строки).

С помощью CoCreateinstance нужно получить доступ к интерефейсу IOleCommandTarget, где задействовать метод Exec.

Непонятно. Конкретнее.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Re: CoCreateinstance & IOleCommandTarget and etc.

Сообщение Alexanbar » 06.04.2009 (Пн) 14:12

Смотрим раздел реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoad.

Там указаны CLSID. Нужно эти объекты запустить. Нашел код на C для ReactOS (взято с http://www.reactos.org/generated/doxyge ... ource.html):
Код: Выделить всё
00001 /*
00002  * Copyright 2005 Martin Fuchs
00003  *
00004  * This library is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU Lesser General Public
00006  * License as published by the Free Software Foundation; either
00007  * version 2.1 of the License, or (at your option) any later version.
00008  *
00009  * This library is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  * Lesser General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU Lesser General Public
00015  * License along with this library; if not, write to the Free Software
00016  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00017  */
00018
00019
00020  //
00021  // Explorer clone
00022  //
00023  // shellservices.cpp
00024  //
00025  // Martin Fuchs, 28.03.2005
00026  //
00027
00028
00029 #include <precomp.h>
00030
00031 #include "shellservices.h"
00032
00033
00034 int SSOThread::Run()
00035 {
00036     ComInit usingCOM(COINIT_APARTMENTTHREADED|COINIT_DISABLE_OLE1DDE|COINIT_SPEED_OVER_MEMORY);
00037
00038     HKEY hkey;
00039     CLSID clsid;
00040     WCHAR name[MAX_PATH], value[MAX_PATH];
00041
00042     typedef vector<SIfacePtr<IOleCommandTarget>*> SSOVector;
00043     SSOVector sso_ptrs;
00044
00045     if (!RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ShellServiceObjectDelayLoad"), &hkey)) {
00046         for(int idx=0; ; ++idx) {
00047             DWORD name_len = MAX_PATH;
00048             DWORD value_len = sizeof(value);
00049
00050             if (RegEnumValueW(hkey, idx, name, &name_len, 0, NULL, (LPBYTE)&value, &value_len))
00051                 break;
00052
00053             if (!_alive)
00054                 break;
00055
00056             SIfacePtr<IOleCommandTarget>* sso_ptr = new SIfacePtr<IOleCommandTarget>;
00057
00058             if (CLSIDFromString(value, &clsid) == NOERROR) {
00059                 if (SUCCEEDED(sso_ptr->CreateInstance(clsid, IID_IOleCommandTarget))) {
00060                     if (SUCCEEDED((*sso_ptr)->Exec(&CGID_ShellServiceObject, OLECMDID_NEW, OLECMDEXECOPT_DODEFAULT, NULL, NULL)))
00061                         sso_ptrs.push_back(sso_ptr);
00062                 }
00063             }
00064         }
00065
00066         RegCloseKey(hkey);
00067     }
00068
00069     if (!sso_ptrs.empty()) {
00070         MSG msg;
00071
00072         while(_alive) {
00073             if (MsgWaitForMultipleObjects(1, &_evtFinish, FALSE, INFINITE, QS_ALLINPUT) == WAIT_OBJECT_0+0)
00074                 break;  // _evtFinish has been set.
00075
00076             while(_alive) {
00077                 if (!PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
00078                     break;
00079
00080                 if (msg.message == WM_QUIT)
00081                     break;
00082
00083                 TranslateMessage(&msg);
00084                 DispatchMessage(&msg);
00085             }
00086         }
00087
00088          // shutdown all running Shell Service Objects
00089         for(SSOVector::iterator it=sso_ptrs.begin(); it!=sso_ptrs.end(); ++it) {
00090             SIfacePtr<IOleCommandTarget>* sso_ptr = *it;
00091             (*sso_ptr)->Exec(&CGID_ShellServiceObject, OLECMDID_SAVE, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
00092             delete sso_ptr;
00093         }
00094     }
00095
00096     return 0;
00097 }


По всей видимости, тоже самое нужно сделать и на VB. Перечислять переменные в реестре - это я сделал. Как перегнать строку в GUID - в курсе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: CoCreateinstance & IOleCommandTarget and etc.

Сообщение Хакер » 06.04.2009 (Пн) 14:29

«Запустить объект по CLSID» — бред. Зная CLSID можно создать новый (!) объект. Который потом можно юзать через разные интерфейсы. Юзать можно и уже созданный объект. CLSID в этом случае не нужен.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Re: CoCreateinstance & IOleCommandTarget and etc.

Сообщение Alexanbar » 06.04.2009 (Пн) 14:46

У интерефейса IOleCommandTarget есть метод Exec. Это, насколько я понял, и есть запуск

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Re: CoCreateinstance & IOleCommandTarget and etc.

Сообщение Alexanbar » 11.05.2009 (Пн) 18:25

Проблема решена благодаря olelib.tlb (Emanmo's Ole Interfaces & functions v1.81), в которой описан интерфейс IOleCommandTarget.

После создания объекта с помощью CoCreateInstance по идентификаторам класса и интерфейса к созданному объекту применяется метод exec интерфейса IOleCommandTarget с параметрами OLECMDID_NEW, OLECMDEXECOPT_DODEFAULT.

В результате в рукотворном трее появляются иконки соединений , регулятора громкости и флэшки.

В процессе работы нужно созданные из ветки Shellserviceobjectdelayload объекты сохранять.

По окончании работы нужно к этим объектам выполнить метод exec с параметрами OLECMDID_SAVE,OLECMDEXECOPT_DODEFAULT.


Вернуться в OLE / COM / ActiveX

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList