-
Добрый вечер
Вопрос
Есть антивирус Nano Antivirus ( вообще не принципиально )
У него нет командной строки ( возможно и есть но не найти в документации а то что найдено не работает уже года 3 )
хотелось бы запускать сканирование объектов с командной строки, но ее нет )
но есть интегрированный в explorer shellex dll модуль который при нажатии на файл запускает сканирование этого файла в антивирусе ( те то что хотелось бы сделать через командную строку )
HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers
расширения оболочки прописаны например тут ( одно из мест )
Вопрос
Можно ли используя например rundll32.exe или же подключив shellex библиотеку антивируса к своему продукту каким то образом запустить функцию из этой длл передав в аргументах путь к проверяемому обьекту ?
Экспорт в shellex.dll показал что в ней находятся следующие экспортируемые функции
DllCanUnloadNow
DllGetClassObject
DllRegisterServer
DllUnregisterServer
первые 2 при вызовах ничего не дали
те вопрос в том можно ли как то эмулировать вызов функции из dll которая прописана как расширение оболочки explorer.exe ?
-
Можно. Но предварительно надо изучить такие вещи как COM-сервера и то как работают и вызываются расширения оболочки.
-
ок
следующий вопрос
я так понимаю что изучать работу com серверов время немного нет свободного на данном этапе
возможно кому то интересно будет сделать реализацию на delphi либо в виде вызова через командную строку ( например через rundll32.exe )
понятное дело за деньги
Например за 100 $
пишите сюда или на email контакты для связи
-
Этот rundll32.exe вообще не при чём. Подключать dll напрямую в свой проект - тоже мимо.
Вам надо брать GUID этой библиотеки (там же в реестре, чуть ниже по дереву что вы описали) и создавать COM-объект через функцию CreateComObject().
Потом, от полученного IInterface можно пробовать получать интерфейсы методом QueryInterface(). А вот какие интерфейсы вам нужно пробовать подключать - это уже вопрос.
Какие именно там имеются ContextMenuHandlers?
-
...
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 заменяются на название нужного интерфейса. Какой вам нужен - надо разбираться.
-
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;
-
За 100$ я бы взялся gdale@ya.ru