Помогите разобраться с ActiveX-контролом для эксплорера.

yolki

предыдущая уехала в архив
Диспозиция: есть китайский activex контрол (npwebclient.dll). встраивается на вебморду видеорегистратора для доступа к накопленным видео.
работает в IE и в некоторых версиях хрома (проверена на 36 portable).
в IE используется механизм встраивания через ActiveX, в хроме - NPAPI (привет нетскейпу).
Задача: Оторвать этот плагин от эксплорера и встроить в C#-приложение для автоматизации выкачивания отснятого видео.
Что имеем:
судя по реверсу js происходит примерно следующее (WebClient - это контрол, содержащий этот самый ActiveX):

WebClient.SetVisible(1);
s=WebClient.GetPluginVersion;
WebClient.CanInitialize;
res=WebClient.ExecuteLocalCmd('<request> <command name="setlanguage"> <language>russian</language></command></request>');
res=WebClient.ExecuteLocalCmd('<request><command name="gethostinfo"></command></request>');
// тут паристся res, вынимаются данные HostInfo.hostname, HostInfo.hostmac и т.п.
WebClient.SetIPAddr(...);
WebClient.SetPort(...);
WebClient.ConnectToServer;

loginXML= '
<request><command name="login''>
<parameter name="username">admin</parameter>
<parameter name="password">...</parameter>
...
</command></request>';

// А вот дальше - у меня когнитивный диссонанс.
SetNofityCallback(func); // Nofity (sic!)
WebClient.ExcuteCmdAsyn(loginxml);
...
}

SetNofityCallback устанавливает некий глобальный обработчик, который каким-то образом вызывается из WebClient.
Когда я этот самый WebClient пытаюсь использовать в C# приложении у меня нет возможности донести до него мои колбэки.
У него в tlb есть какой-то WebClientEvents, который даже помечен в coclass-е как source:

[
uuid(9EF2BA47-C6A7-470D-9DD9-4323B0CB8353
helpstring("WebClient Control"
control
]
coclass WebClient {
[default] dispinterface _DWebClient;
[default, source] dispinterface _DWebClientEvents;
};

Однако там пусто, мне не на что делегатов повесить.
и формат делегатов я не знаю (но могу догадаться из js).
Судя по исходникам js оно хочет минимум 4 делегата:

...
{ if (d.indexOf ("macintosh") != -1
|| d.indexOf ("mac os x 10") != -1
|| h.indexOf ("macintel") != -1)
{WebClient.OnExcuteCmdNotifyReply =
OnExcuteCmdNotifyReply;
WebClient.OnNetDisconnect = OnNetDisconnect;
WebClient.OnNetReLogined = OnNetReLogined;
WebClient.OnDisconnectByServer =
OnDisconnectByServer;

Но эти делегаты устанавливаются явно только в случае использования яблок.
Не понятно, как их задать при использовании в C# приложении.
файл:
если не боитесь его запускать, можно положить в c:\windows\system32\webclient и позвать regsvr32 на него.
на 64-битной системе его нужно класть в C:\Windows\SysWOW64\webclient\
исходники js/html, на которые можно посмотреть:

yolki

Да, забыл описать симптомы:
В C# работает до вызова ExcuteCmdAsyn на котором всё валится в AccessViolation. Подозреваю именно из-за отсутствия нужного делегата

kill-still

Может быть ты CoInitializeEx вызываешь с другими параметрами, не такими, как это делает IE?

agaaaa

А почему не попытаться траффик между контролом и регистратором отследить?

kill-still

Траффик? Какой ещё траффик? (jump-ы? :confused: )
Можно попробовать как-нибудь вклинится в процедуру позднего связывания, через которую идут вызовы. Но для этого потребуется IE под отладчиком запустить.

Dasar

Паллиативное решение не подходит? В приложение вставить embedded IE, а в него вставить activeX?

Dasar

В C# работает до вызова ExcuteCmdAsyn на котором всё валится в AccessViolation. Подозреваю именно из-за отсутствия нужного делегата
Предполагаю, что валится всё из-за того, что control хочет какой-нибудь специфический host-интерфейс, который поддерживается IE, но не поддерживается .net-формой.
Решение: делать свой Ole-hosting.

yolki

Решение: делать свой Ole-hosting.
Поясни.
На с++ писать вот эти все CoCreateInstance?
а на шарпе вручную позвать его можно?
обёрткой в виде AxHost? ну так оно им же в шарп и тянется.

Dasar

На с++ писать вот эти все CoCreateInstance?
OLE-контейнер делается на C#. На смеси PInvoke, Marshal-а и переобъявлении com-овских интерфейсов.

Dasar

можно положить в c:\windows\system32\webclient
Почему надо класть именно в эту папку?

Dasar

Погуглил тему. Microsoft и остальной интернет рекомендуют использовать вариант с Embedded IE (WebBrowser control) для хостинга сложных ActiveX. Альтернативных вариантов нет даже в виде набросков.
Имхо, стоит тогда использовать Embedded IE и не заморачиваться.

agaaaa

Траффик? Какой ещё траффик? (jump-ы? )
встраивается на вебморду видеорегистратора для доступа к накопленным видео
Я из этого предположил, что контрол потом с видеорегистратора как-то скачивает или стримит видео. Если так, не понятно, что мешает их скачивать/стримить без контрола.

yolki

wireshark внятного ничего не показал.
какие-то блобы передаются

carusya

wireshark внятного ничего не показал.
какие-то блобы передаются
А в начале нет инициализации передачи по RTSP?
Скинь дамп начала передачи видео.
Оставить комментарий
Имя или ник:
Комментарий: