Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > (TWebBrowser || TChromium || TEmbeddedWB) |
Автор: BasMan 12.10.2013, 12:20 |
Разрабатываю ПО, на C++ Builder XE5, пробовал разные браузеры (указаны в топике) ... нигде нет возможности задать используемый клиентский сертификат, в браузерах на основе IE выскакивает штатное окно браузера с выбором сертификата, в хромиуме просто белая страница открывается. Весь инет перерыл, нигде не нашел решения, встречаются только вопросы подобные моему. Другие компоненты неподходят, нужен именно браузер. Сейчас буду вкорячивать Gecko ... |
Автор: BasMan 15.10.2013, 08:30 |
Нашел неплохую альтернативу, Awesomium, теперь другая проблема не линкуется .lib-ка, перепробовал всякие варианты с штатным implib, coff2omf и Digital Mars-овским implib-ом, все равно, не видит функции. И незнаю, в этой теме писать, или отдельную создавать. Пока тут напишу, т.к. если продвинусь дальше, то буду описывать как работать с сертификатами. Думаю что проблема в 00B490 THEADR Awe_DataPakSource_director_connect 00B4B7 COMENT Purge: Yes, List: Yes, Class: 160 (0A0h), SubClass: 1 (01h) Dynamic link import (IMPDEF) Imported by: name Internal Name: Awe_DataPakSource_director_connect Module Name: awesomium.dll Imported name: _Awe_DataPakSource_director_connect@8 00B516 MODEND В _ перед именем функции в Imported name Перебирал разные опции командной строки, не могу убрать "лишние" _ вообще |
Автор: BasMan 15.10.2013, 15:13 |
Добился такого 0009E0 THEADR Awe_DataPakSource_director_connect 000A07 COMENT Purge: Yes, List: Yes, Class: 160 (0A0h), SubClass: 1 (01h) Dynamic link import (IMPDEF) Imported by: name Internal Name: Awe_DataPakSource_director_connect Module Name: awesomium.dll 000A41 MODEND но все равно [ilink32 Error] Error: Unresolved external 'Awesomium::WebStringArray::~WebStringArray()' referenced from D:\PROJECTS\IP\WIN32\DEBUG\******* [ilink32 Error] Error: Unresolved external 'Awesomium::WebString::~WebString()' referenced from D:\PROJECTS\IP\WIN32\DEBUG\******* [ilink32 Error] Error: Unresolved external 'Awesomium::WebConfig::WebConfig()' referenced from D:\PROJECTS\IP\WIN32\DEBUG\********* [ilink32 Error] Error: Unresolved external 'Awesomium::WebCore::Initialize(Awesomium::WebConfig&)' referenced from D:\PROJECTS\IP\WIN32\DEBUG\********* |
Автор: xvr 16.10.2013, 12:56 |
А Awesomium вообще под Builder? Если нет, то работать не будет, даже если вам и удасться каким то чудом ее прилинковать ![]() |
Автор: BasMan 17.10.2013, 06:35 |
Тьфу, все правильно, так заработался, забыл что это не простые C типы. А если на VC написать библиотеку-враппер, которая экспортирует функции как C, а сама работает с Awesomium? Хотя с таким же успехом можно сразу пробовать CEF. |
Автор: BasMan 21.3.2015, 18:15 | ||||
Выдалось свободное время, продолжил копать в этом направлении, накопал следующее, в Windows 7/2008 и выше, в urlmon.h присутствует интерфейс:
Судя по описанию, в приложении должна быть реализация данного интерфейса в виде класса, где будет перегружаться функция GetSerializedClientCertContext, при вызове которой можно подсунуть блоб с сертификатом/ключом. Вызывается как раз в момент "возникнования потребности" в пользовательском сертификате (по дефолту отображается диалоговое окно IE с выбором сертификата). Кто может подсказать, как правильно сделать реализацию? Вот фрагмент кода:
Заранее спасибо. |
Автор: BasMan 23.3.2015, 18:23 |
Нашел на другом форуме: 1. Запросите (через QueryInterface) у IWebBrowser2 интерфейс IConnectionPointContainer. 2. Метод FindConnectionPoint с идентификатором DIID_DWebBrowserEvents2 вернет вам указатель на IConnectionPoint - это "точка", через которую можно подписаться на нужные события. 3. Вызываете pConnectionPoint->Advise, передаете туда указатель на свой объект. Объект этот должен быть наследником IDispatch. 4. Теперь на любые события будет вызываться метод Invoke этого объекта: первым аргументом придет тип события, напимер для DocumentComplete это будет DISPID_DOCUMENTCOMPLETE. Аргументы вызова, если нужно, достаются из массива DispParams (они там в обратном порядке лежат, Нужно запросить у XXXXX интерфейс HttpNegitiate || HttpNegitiate3 (?), метод FindConnectionPoint с идентификатором IID_IHttpNegotiate3 вернет указатель на IConnectionPoint . Нужно вызывать IConnectionPoint->Advise и передать туда указатель на свой объект наследник IDispatch. На любые события будет вызываться метод Invoke объекта, первым аргументом будет тип события (?) .... |
Автор: xvr 25.3.2015, 17:56 | ||
Каким боком связывание ActiveX события с приемником этого события (а именно это описанно в вашей цитате) относится к HttpNegitiate3, который судя по описанию вообще не ActiveX объект (и не унаследован от IDispatch) Информацию надо искать не на помойке (под названием Интернет), а у первоисточника - https://msdn.microsoft.com/en-us/library/ms775054(v=vs.85).aspx Там собственно сказано -
|
Автор: BasMan 6.4.2015, 19:58 | ||
Ок,
А каким образом заставить браузер обратиться к объекту? Я так понимаю через IServiceProvider? Тоже свою реализацию писать? |
Автор: xvr 7.4.2015, 15:41 | ||
Во первых -
Во вторых - методы от IHttpNegotiate2 вам тоже придется реализовать (т.к. IHttpNegotiate3 унаследован от IHttpNegotiate2) Замечательный вопрос. Лично я не уверен, что UrlMON имеет отношение к IE ![]() Вам скорее надо копать в сторону CryptoAPI, точнее к хранилищам сертификатов. Или куда то сюда - http://stackoverflow.com/questions/25771377/import-client-certificate-in-ie-with-javascript |
Автор: BasMan 7.4.2015, 17:04 | ||
Я думаю имеет, т.к. в исходниках того же Chromium, FF и TEmbeddedWB есть упоминания интерфейса HttpNegotiate, вот фрагмент Chromium:
и это один маленький кусочек первый попавшийся по запросу "chrome httpnegotiate interface" |
Автор: BasMan 2.2.2016, 22:00 |
Может кому поможет. Сделал так, программа при запуске очищает хранилище сертификатов (через certmgr.exe), в нужный момент (перед открытием страницы) устанавливает нужный сертификат в хранилище, страница открывается без лишних запросов, если нужно войти под другим сертификатом, снова очищаем хранилище, ставим нужный сертификат, открываем страницу. |
Автор: xvr 3.2.2016, 12:11 |
За такой 'метод' ваши пользователи побъют вас ноутбуками (насмерть) ![]() |
Автор: tzirechnoy 3.2.2016, 14:47 | ||
"Нас не догонят!" |