Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Вызов функции из dll через rundll32 - shellex


gerhy4 ©   (24.06.18 22:44

Добрый вечер

Вопрос

Есть антивирус Nano Antivirus ( вообще не принципиально )

У него нет командной строки ( возможно и есть но не найти в документации а то что найдено не работает уже года 3 )

хотелось бы запускать сканирование объектов с командной строки, но ее нет )

но есть интегрированный в explorer shellex dll модуль который при нажатии на файл запускает сканирование этого файла в антивирусе ( те то что хотелось бы сделать через командную строку )

HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers
расширения оболочки прописаны например тут ( одно из мест )

Вопрос

Можно ли используя например rundll32.exe или же подключив shellex библиотеку антивируса к своему продукту каким то образом запустить функцию из этой длл передав в аргументах путь к проверяемому обьекту ?

Экспорт в shellex.dll показал что в ней находятся следующие экспортируемые функции

DllCanUnloadNow
DllGetClassObject
DllRegisterServer
DllUnregisterServer

первые 2 при вызовах ничего не дали

те вопрос в том можно ли как то эмулировать вызов функции из dll которая прописана как расширение оболочки explorer.exe ?


Dimka Maslov ©   (24.06.18 23:32[1]

Можно. Но предварительно надо изучить такие вещи как COM-сервера и то как работают и вызываются расширения оболочки.


gerhy4 ©   (25.06.18 01:05[2]

ок

следующий вопрос

я так понимаю что изучать работу com серверов время немного нет свободного на данном этапе

возможно кому то интересно будет сделать реализацию на delphi либо в виде вызова через командную строку ( например через rundll32.exe )

понятное дело за деньги
Например за 100 $

пишите сюда или на email контакты для связи


Прохосый   (25.06.18 17:11[3]

Этот rundll32.exe вообще не при чём. Подключать dll напрямую в свой проект - тоже мимо.

Вам надо брать GUID этой библиотеки (там же в реестре, чуть ниже по дереву что вы описали) и создавать COM-объект через функцию CreateComObject().
Потом, от полученного IInterface можно пробовать получать интерфейсы методом QueryInterface(). А вот какие интерфейсы вам нужно пробовать подключать - это уже вопрос.
Какие именно там имеются ContextMenuHandlers?


Прохосый   (25.06.18 17:35[4]

...
const CLSID_NanoAntivirusShellEx: TGUID = '{........}'; // из реестра, в нём ещё настроен путь к dll/exe
var Ret: HRESULT; NanoAntivirusObj: IInterface; SomeInterface: ISomeInterface;
begin
NanoAntivirusObj:=CreateComObject(CLSID_NanoAntivirusShellEx);
Ret:=NanoAntivirusObj.QueryInterface(IID_SomeInterface, SomeInterface);
if not Succeeded(Ret) then ShowMessage('NanoAntivirusObj :: QueryInterface :: IID_SomeInterface :: '+SysErrorMessage(Ret));
...

Возможно на всякий случай хорошо бы ещё и в try обернуть, но вроде и так пойдёт.
Все вхождения SomeInterface заменяются на название нужного интерфейса. Какой вам нужен - надо разбираться.


Зодчий   (26.06.18 00:42[5]

function ComObjectExists(const CLSID: TGUID): boolean;
var Ret: HRESULT; ProgID: POleStr;
begin
Ret:=ProgIDFromCLSID(CLSID, ProgID);
// btw, Is it necessary to free ProgID?
case Ret of
   S_OK:
       Result:=True;
   REGDB_E_CLASSNOTREG:
       Result:=False;
   else
       raise EOleSysError.Create(#9'Error in ComObjectExists:'+#13#10#13#10+'CLSID:   '+GUIDToString(CLSID)+#13#10#13#10+SysErrorMessage(Ret), Ret, 0);
   end;
end;

...
const CLSID_NanoAntivirusShellEx: TGUID = '{...-...-...-...-...}';
var Ret: HRESULT; NanoAntivirusShellEx: IInterface; SomeShellExInterface: ISomeShellExInterface;
begin
if ComObjectExists(CLSID_NanoAntivirusShellEx) then
   begin
   NanoAntivirusShellEx:=CreateComObject(CLSID_NanoAntivirusShellEx);
   Ret:=NanoAntivirusShellEx.QueryInterface(IID_ISomeShellExInterface, SomeShellExInterface);
   if Succeeded(Ret) then
       begin
       ...
       // use SomeShellExInterface
       ...
       SomeShellExInterface:=nil;
       end
   else
       ShowMessage('NanoAntivirusShellEx :: QueryInterface :: IID_ISomeShellExInterface :: '+SysErrorMessage(Ret));
   NanoAntivirusShellEx:=nil;
   end
else
   ShowMessage('NanoAntivirusShellEx :: '+SysErrorMessage(Cardinal(REGDB_E_CLASSNOTREG)));
end;


DayGaykin ©   (12.07.18 09:49[6]

За 100$ я бы взялся gdale@ya.ru


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо