Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.29;
Скачать: CL | DM;

Вниз

конфликт двух DLL при совместном использовании   Найти похожие ветки 

 
pest ©   (2011-10-17 14:44) [0]

всем привет.

в проекте использую компонент TChromium (использующий libcef.dll) и TSslHttpCli (использующий ssleay32.dll). говоря простым языком, на форме лежит компонент браузера от хромиум и при этом я работаю с SSL через компонент ICS. рядом с экзешником положил две библиотеки для работы с ссл (ssleay32.dll и libeay32.dll) и еще несколько библиотек, которые использует хромиум.
когда запускаю программу и пытаюсь работать с SSL через TSslHttpCli, постоянно вылетают ошибки access violation по адресу 0000... как только убираю с формы хромиум и удаляю дллки, то все работает нормально.
мне кажется что происходит какой-то конфликт между этими библиотеками (ssleay32.dll и libcef.dll), только как решить эту проблему не знаю. подскадите куда копать? может как-то можно их раскидать по разным папкам и как-то приложению указать откуда с какой библиотекой работать??


 
Игорь Шевченко ©   (2011-10-17 19:51) [1]


> мне кажется что происходит какой-то конфликт между этими
> библиотеками


С чего бы ?


> подскадите куда копать?


в сторону отладчика, например.


 
Dennis I. Komarov ©   (2011-10-17 20:06) [2]


> мне кажется что происходит какой-то конфликт между этими
> библиотеками (ssleay32.dll и libcef.dll)

не, они конфликтуют с user32.dll, а та в свою очередь с kernel...
А AV - это глюки не программиста, а разработчиков Windows. Ну не знали они что есть try/except


 
pest ©   (2011-10-18 10:12) [3]

2Игорь Шевченко
>С чего бы ?
потому что AV выскакивает то в одной библиотеке то в другой, в непонятной для меня последовательности
>в сторону отладчика, например.
не понятно. что мне отладить DLL?

2Dennis I. Komarov
>не, они конфликтуют с user32.dll, а та в свою очередь с kernel...
выход какой-то же есть? или просто отказаться от совместного использования этих библиотек?


 
Ega23 ©   (2011-10-18 11:10) [4]


> что мне отладить DLL?


Ну да.


 
DiamondShark ©   (2011-10-18 11:18) [5]


> что мне отладить DLL?

Не DLL, а взаимодействие с ними. Если "AV выскакивает то в одной библиотеке то в другой, в непонятной для меня последовательности", то, к гадалке не ходи, это означает, что ты им пихаешь мусорные данные, или где-то своими кривыми действиями портишь память.
Сами-то DLL сторонних производителей и, скорее всего, ни при чём. Колобродиво в твоём коде.


 
pest ©   (2011-10-18 12:13) [6]

2DiamondShark
>Колобродиво в твоём коде.

создал специально проект. на форме валяется браузер хромиум. рядом с ехешником валяются:
для хромиума (взято из архива компонента dcef-r275)
 avcodec-53.dll
 avformat-53.dll
 avutil-51.dll
 d3dcompiler_43.dll
 d3dx9_43.dll
 icudt.dll
 libcef.dll
 libEGL.dll
 libGLESv2.dll

для работы с SSL (взято с сайта компонента ICS)
 libeay32.dll
 ssleay32.dll

сертификат (взято с сервера, требующего данный сертификат)
 cert.crt
 private.key


unit Unit2;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, cef, OverbyteIcsHttpProt, OverbyteIcsWSocket;

type
 TForm2 = class(TForm)
   Chromium1: TChromium;
   Button1: TButton;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
 ms: TStringStream;
 http: TSslHttpCli;
 trycounter: Integer;
 welldone: Boolean;
begin
 welldone := false;
 memo1.Clear;
 trycounter := 0;
 repeat
   Inc(trycounter);
   http := TSslHttpCli.Create(nil);
   http.RcvdStream := TStringStream.Create;
   ms := TStringStream.Create("{"method": "PingAPI"}");
   try
     http.URL := "https://soap.direct.yandex.ru/json-api/v4/";
     http.SendStream := ms;
     http.SslContext := TSslContext.Create(nil);
     http.SslContext.SslCertFile := "cert.crt";
     http.SslContext.SslPrivKeyFile := "private.key";
     try
       http.Post;
     except
       Continue;
     end;
     if http.StatusCode <> 200 then Continue;

     memo1.Lines.Text := Utf8ToAnsi(TStringStream(http.RcvdStream).DataString);
     welldone := true;
   finally
     ms.Free;
     http.Free;
     http := nil;
   end;
 until welldone or (trycounter >= 20);
end;

end.


что не так с кривыми руками? буду рад выпрямить


 
DiamondShark ©   (2011-10-18 12:19) [7]


> pest ©   (18.10.11 12:13) [6]

И в какой строке тут происходит исключение?


 
stas ©   (2011-10-18 12:20) [8]

pest ©   (18.10.11 12:13) [6]
Осталось обозначить в какой момент появляется AV.
И как подключены DLL


 
pest ©   (2011-10-18 14:46) [9]

DLL просто лежат в каталоге с программой.
ошибка возникает в модуле OverbyteIcsWSocket
в функции
procedure TCustomSslWSocket.HandleSslError;
begin
   FLastSslError := f_ERR_peek_error;  //AV ТУТ
   if FLastSslError = 0 then
       Exit;
{$IFNDEF NO_DEBUG_LOG}
   if CheckLogOptions(loSslErr) then begin
       Inc(TraceCount);
       DebugLog(loSslErr, _Format("%s  %d  [%d] %s",
                                 [_IntToHex(INT_PTR(Self), SizeOf(Pointer) * 2),
                                  FHSocket, TraceCount,
                                  LastOpenSslErrMsg(TRUE)]));
   end
   else
       f_ERR_clear_error;
{$ELSE}
   f_ERR_clear_error;
{$ENDIF}
end;


 
Ega23 ©   (2011-10-18 14:52) [10]


> ошибка возникает в модуле OverbyteIcsWSocket


99% даю, что экземпляр TCustomSslWSocket не создан. Или уже убит.


 
pest ©   (2011-10-18 14:59) [11]

2Ega23
>99% даю, что экземпляр TCustomSslWSocket не создан. Или уже убит.
я же им напрямую не управляю. что нужно сделать, как решить проблему?


 
Ega23 ©   (2011-10-18 15:02) [12]


> я же им напрямую не управляю. что нужно сделать, как решить
> проблему?


А я откуда знаю? Не моя же библиотека.
AV в том месте с ааафигенно большой вероятностью указывает на то, что экземпляр данного класса не создан. Почему - смотри отладчиком, у тебя есть CallStack.


 
pest ©   (2011-10-18 15:15) [13]

OverbyteIcsWSocket.pas.13771: FLastSslError := f_ERR_peek_error;
004FE4D1 A1CCC95100       mov eax,[$0051c9cc]
004FE4D6 8B00             mov eax,[eax]
004FE4D8 FFD0             call eax    AV ТУТ
004FE4DA 8B55FC           mov edx,[ebp-$04]
004FE4DD 8982F4060000     mov [edx+$000006f4],eax


не умею я им пользоваться. стек мне ни о чем не говорит :(

но все равно без библиотек, которые я кинул для хромиума, все работает на ура. только приходится вместо хромиума использовать tembeddedwb. и это поршиво.

может всетаки библиотеки хромиума чтото ломают, а не ICS виноват? ковырять их юниты не до конца понимая что да как у меня не получится


 
Ega23 ©   (2011-10-18 15:19) [14]


> не умею я им пользоваться. стек мне ни о чем не говорит  :(


Проблемы индейцев шерифа ...  Ну ты понел.


> может всетаки библиотеки хромиума чтото ломают


Сомневаюсь. Скорее кто-то что-то недопонимает.


 
pest ©   (2011-10-18 15:26) [15]

2Ega23
>Сомневаюсь. Скорее кто-то что-то недопонимает.
тогда, если ктото чтото может понимать, дай мне простой ответ на вопрос: почему без хромовских библиотек все работает без проблем???


 
Ega23 ©   (2011-10-18 15:27) [16]


>  дай мне простой ответ на вопрос: почему без хромовских
> библиотек все работает без проблем???


1. Я не знаю, что такое "хромовские библиотеки".
2. Я вообще не понимаю, что за задача решается.
3. Но я точно знаю, что чудес не бывает.


 
pest ©   (2011-10-18 15:36) [17]

2Ega23
а ты посты внимательно читал вообще? [6] например

задача заключается в том, что нужно в проекте иметь браузер от TChromium и иметь компоненты для работы с яндексом через SSL, используя сертификаты, которые яндекс мне дает сам. indy работает крайне нестабильно, в clever components я не нашел как подключить сертификаты самому не устанавливая их в систему. поэтому я взял за основу работы компонент ICS в часности TSslHttpCli. он работает замечательно, кроме случая, когда в проекте присутствует хромиум. что не понятного.


 
han_malign   (2011-10-18 15:59) [18]


> FLastSslError := f_ERR_peek_error;  //AV ТУТ

- подозреваю, что  функции f_ERR_xxx присутствуют в обоих библиотеках, но в одной контекст не инициализирован(за ненадобностью?)...
В этом случае надо явно квалифицировать модуль из которого берется символ - <заголовочник SslHttp>.f_ERR_xxx, либо поменять порядок подключаемых модулей в uses...


 
han_malign   (2011-10-18 16:05) [19]

З.Ы. Также нужно обратить внимание на конфликт имен функций инициализации контекста библиотек...


 
pest ©   (2011-10-18 16:16) [20]

>В этом случае надо явно квалифицировать модуль из которого берется символ
сделал. не помогает
procedure TCustomSslWSocket.HandleSslError;
begin
   FLastSslError := OverbyteIcsLIBEAY.f_ERR_peek_error;
   if FLastSslError = 0 then
       Exit;
{$IFNDEF NO_DEBUG_LOG}
   if CheckLogOptions(loSslErr) then begin
       Inc(TraceCount);
       DebugLog(loSslErr, _Format("%s  %d  [%d] %s",
                                 [_IntToHex(INT_PTR(Self), SizeOf(Pointer) * 2),
                                  FHSocket, TraceCount,
                                  LastOpenSslErrMsg(TRUE)]));
   end
   else
       f_ERR_clear_error;
{$ELSE}
   f_ERR_clear_error;
{$ENDIF}
end;


>либо поменять порядок подключаемых модулей в uses
тоже не помогает

>Также нужно обратить внимание на конфликт имен функций инициализации контекста библиотек...
что именно сделать и где?  я то библиотеки просто кинул в папку и сам не подключал. может самому подключать надо руками както? и как обнаружить конфликт имен функция?..


 
Ega23 ©   (2011-10-18 16:21) [21]


> что именно сделать и где?


Call Stack посмотреть.


 
pest ©   (2011-10-18 17:04) [22]

[21] ничем не помогает твой ответ. даже бесит немного. я ведь писал что не понимаю в стеке ничего, зачем писать бесполезный пост. если есть иное решение проблемы, то я буду ждать. а в стек лазить не смогу. именно поэтому я и задаю вопрос на форуме, потому что не знаю всех примочек в делфи


 
Ega23 ©   (2011-10-18 17:21) [23]


>  я ведь писал что не понимаю в стеке ничего, зачем писать
> бесполезный пост.


Тогда найми программиста.


 
han_malign   (2011-10-18 17:24) [24]


> что именно сделать и где?

- где вызывается OverbyteIcsLIBEAY.Load...


 
sniknik ©   (2011-10-18 17:34) [25]

> ssleay32.dll и libeay32.dll
какой версии библиотеки?

у меня была проблема на версии 1.0 на 64 разрядных машинах при том, что на сервере к которому подключался была версия 0,98k (вроде так).

ошибка была не AV, что то специфичное, но тем не менее...


 
pest ©   (2011-10-18 17:45) [26]

2Ega23
>Тогда найми программиста.
чувак, нечем помочь - не читай ветку

2han_malign
>- где вызывается OverbyteIcsLIBEAY.Load...

тут:
procedure LoadSsl;
var
   Tick : Cardinal;
   S    : String;
{$IFDEF LOADSSL_ERROR_FILE} // Optional define in OverbyteIcsSslDefs.inc
   F    : TextFile;
   I, J : Integer;
{$ENDIF}
begin
   _EnterCriticalSection(SslCritSect);
   try
       if SslRefCount = 0 then begin
           // Load LIBEAY DLL
           // Must be loaded before SSlEAY for the versioncheck to work!
           if not OverbyteIcsLIBEAY.Load then begin
           {$IFDEF LOADSSL_ERROR_FILE}
               AssignFile(F, _ExtractFilePath(ParamStr(0)) + "FailedIcsLIBEAY.txt");
               Rewrite(F);
               S := OverbyteIcsLIBEAY.WhichFailedToLoad;
               I := 1;
               while I < Length(S) do begin
                   J := I;
                   while (I <= Length(S)) and (S[I] <> " ") do
                       Inc(I);
                   Inc(I);
                   WriteLn(F, Copy(S, J, I - J));
               end;
               CloseFile(F);
           {$ENDIF}
               if OverbyteIcsLIBEAY.GLIBEAY_DLL_Handle <> 0 then begin
                   _FreeLibrary(OverbyteIcsLIBEAY.GLIBEAY_DLL_Handle);
                   OverbyteIcsLIBEAY.GLIBEAY_DLL_Handle := 0
               end;
               raise EIcsLibeayException.Create("Unable to load LIBEAY DLL. Can""t find " + S);
           end;
           // Load SSlEAY DLL
           if not OverbyteIcsSSLEAY.Load then begin
           {$IFDEF LOADSSL_ERROR_FILE}
               AssignFile(F, _ExtractFilePath(ParamStr(0)) + "FailedIcsSSLEAY.txt");
               Rewrite(F);
               S := OverbyteIcsSSLEAY.WhichFailedToLoad;
               I := 1;
               while I < Length(S) do begin
                   J := I;
                   while (I <= Length(S)) and (S[I] <> " ") do
                       Inc(I);
                   Inc(I);
                   WriteLn(F, Copy(S, J, I - J));
               end;
               CloseFile(F);
           {$ENDIF}
               if OverbyteIcsSSLEAY.GSSLEAY_DLL_Handle <> 0 then begin
                   _FreeLibrary(OverbyteIcsSSLEAY.GSSLEAY_DLL_Handle);
                   OverbyteIcsSSLEAY.GSSLEAY_DLL_Handle := 0;
               end;
               if OverbyteIcsLIBEAY.GLIBEAY_DLL_Handle <> 0 then begin
                   _FreeLibrary(OverbyteIcsLIBEAY.GLIBEAY_DLL_Handle);
                   OverbyteIcsLIBEAY.GLIBEAY_DLL_Handle := 0
               end;
               raise EIcsSsleayException.Create("Unable to load SSLEAY DLL. Can""t find " + S);
           end;

           // Global system initialization
           if f_SSL_library_init <> 1 then begin
               if OverbyteIcsSSLEAY.GSSLEAY_DLL_Handle <> 0 then begin
                   _FreeLibrary(OverbyteIcsSSLEAY.GSSLEAY_DLL_Handle);
                   OverbyteIcsSSLEAY.GSSLEAY_DLL_Handle := 0;
               end;
               if OverbyteIcsLIBEAY.GLIBEAY_DLL_Handle <> 0 then begin
                   _FreeLibrary(OverbyteIcsLIBEAY.GLIBEAY_DLL_Handle);
                   OverbyteIcsLIBEAY.GLIBEAY_DLL_Handle := 0
               end;
           end;
           f_SSL_load_error_strings;
           Tick := _GetTickCount;           // probably weak
           f_RAND_seed(@Tick, SizeOf(Tick));
       {$IFNDEF OPENSSL_NO_ENGINE}
           //* Load all bundled ENGINEs into memory and make them visible */
           f_ENGINE_load_builtin_engines;
       {$ENDIF}
       end; // SslRefCount = 0
       Inc(SslRefCount);
   finally
       _LeaveCriticalSection(SslCritSect);
   end;
end;


нашел места где загружаются библиотеки libeay32.dll и ssleay32.dll и поменял путь загрузки на другую папку на всякий случай. но ничего не изменилось.
и еще: AV возникает до того как вызывается функция LoadSsl


 
pest ©   (2011-10-18 17:47) [27]

2sniknik
версия библиотек 0.9.8h
работаю на win7*64 delphi xe


 
_Юрий   (2011-10-18 20:03) [28]


> procedure TCustomSslWSocket.HandleSslError;
> begin
>    FLastSslError := f_ERR_peek_error;  //AV ТУТ
>


Надо поставить тут брекпоинт, и посмотреть, чему равен Self
не nil ли(не был создан?)
если не nil, то проверить, живые ли его остальные поля, корректно ли возвращается ClassName - другими словами, жив ли объект

Если не жив, поставить брекпоинты в конструкторе и деструкторе и анализировать, в какой момент экземпляр создается а в какой разрушается, и кем, и почему мы попали на метод после разрушения.
Если ошибка связана с досрочным разрушением объекта - то ее локализовать не очень трудно.
Самый плохой вариант - если память бьется вследствие некорректной работы на низком уровне - например промахнулись при вызове Move. Самый плохой потому, что труднее всего найти причину. В этом случае надо использовать дополнительные инструменты, например FastMem


 
Игорь Шевченко ©   (2011-10-18 20:21) [29]


> чувак, нечем помочь - не читай ветку


> ничем не помогает твой ответ. даже бесит немного. я ведь
> писал что не понимаю в стеке ничего


тебе в самом начале сказано - используй отладчик. Не умеешь использовать - читай доку. Не хочешь читать - иди на платные курсы.


 
pest ©   (2011-10-19 09:54) [30]

2Игорь Шевченко
>тебе в самом начале сказано - используй отладчик. Не умеешь использовать - читай доку. Не хочешь читать - иди на платные курсы.

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


 
pest ©   (2011-10-19 09:59) [31]

2_Юрий
>если не nil, то проверить, живые ли его остальные поля, корректно ли возвращается ClassName - другими словами, жив ли объект

проверил он не нил и имя класса TSslWSocket и в self пошарился тоже вроде живой. я не пойму что означает такое описание:
const
  ...
   f_ERR_peek_error :                         function : Cardinal; cdecl = nil;

"cdecl" я понял что такое "= nil" естесственно тоже. но описание константы как "function : Cardinal;" я не пойму. может просто делать проверку f_ERR_peek_error на nil и чем-то самому ее заполнять?


 
Ega23 ©   (2011-10-19 10:17) [32]


> pest ©   (19.10.11 09:54) [30]


>  судя по твоему "умному" комменту,
... бла-бла-бла....
>  ведь люди отписываются и нормально пытаются помочь,


Тебе искренне пытались помочь. Советовали встать бряком на строку с AV и посмотреть Call Stack (View -> Debug Windows -> Call Stack). Это нужно, чтобы понять, что откуда вызывается. И хоть как-то изначально детектировать ситуацию.
Но нет, тебе посмотреть влом, только к 30-му посту мы узнаём, что f_ERR_peek_error это не какое-то поле, а функция и т.д.
Плюс хамишь.
Я бы принципиально такому поциэнту не ответил, честно. Даже полностью сходу зная ответ.


 
pest ©   (2011-10-19 10:27) [33]

2Ega23
>Тебе искренне пытались помочь. Советовали встать бряком на строку с AV и посмотреть Call Stack (View -> Debug Windows -> Call Stack). Это нужно, чтобы понять, что откуда вызывается. И хоть как-то изначально детектировать ситуацию.
я посмотрел и сразу же отписал что в этом Call Stack в посте [13]. после чего предупредил что им пользоваться не умею. и не влом было посмотреть а сразу же посмотрел. и не в 30 посте а в 13. и не хамил я а просто не хотел менять тему проблемы моего кода на проблему общения с тобой. а если изначально не получил от меня хамства как от первого, то откуда появится принцип не помогать? и даже если есть такой принцип, то зачем сейчас продолжать весь этот базар и гадить в ветке? для меня важнее решать проблему кода, а не обсуждать социальные недопонимания


 
Ega23 ©   (2011-10-19 10:33) [34]


> я посмотрел и сразу же отписал что в этом Call Stack в посте
> [13].


Это не Call Stack. Это CPU-Window. Тебя просили другое.


> откуда появится принцип не помогать?


Оттуда. Тебе нужна помощь в решении проблемы, или чтобы эту проблему за тебя кто-то решил? Если первое - так потрудись хотя бы выдать то, что тебя просят посмотреть. Если второе - выкладывай ТЗ и объявляй сумму, за тебя всё сделают быстро и аккуратно.


>  то зачем сейчас продолжать весь этот базар и гадить в ветке?

Ну пока что гадишь именно ты.


 
pest ©   (2011-10-19 10:57) [35]

>Это не Call Stack. Это CPU-Window. Тебя просили другое.

возникла ошибка, нажал Break и посмотрел в окошке Call Stack. там дважды кликнул на строке, на которой стоял курсор и открылось CPU.
разве не очевидно, что если я не умею пользоваться Call Stack то я могу ошибиться как в него просто посмотреть даже? при желании мог бы тогда сразу мне об этом сказать и я посмотрел бы иначе. и было бы меньше разговоров.
>Тебе нужна помощь в решении проблемы
да. и я стараюсь по мере своих знаний давать то, о чем просят на протяжении всей ветки. даже этот стек попытался посмотреть, хотя не понимаю что там.
>или чтобы эту проблему за тебя кто-то решил
за халявой никогда не обращался и не собираюсь. я сам получаю деньги за то, что делаю. и не думаю что кому-то кайф делать за меня работу. а вот поделиться профессиональным опытом не считаю чем неестественным. я не в наглую говорю сделайте мне. я пытаюсь разобраться, задаю вопросы, лезу в код. все по мере возможностей.
а если изначально смотреть на каждого кто задает вопрос как на халявщика, то зачем утруждаться и вообще читать форумы. просто не отвечай и все. кому надо тот поможет советом и без всяких мыслей что ты на нем зарабатываешь


 
Ega23 ©   (2011-10-19 11:10) [36]


> поможет советом и без всяких мыслей что ты на нем зарабатываешь


Тебе 50 раз уже сказали: используй отладчик.

З.ы. Надоело. Желаю успехов в поиске ошибки.


 
pest ©   (2011-10-19 11:24) [37]

и на том спасибо



Страницы: 1 вся ветка

Текущий архив: 2012.01.29;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.009 c
2-1319387815
Очень злой
2011-10-23 20:36
2012.01.29
Как узнать HANDLE окна, на форме которого находится компонент.


15-1318451402
Юрий
2011-10-13 00:30
2012.01.29
С днем рождения ! 13 октября 2011 четверг


15-1318345230
Awesome-o 4000
2011-10-11 19:00
2012.01.29
Прошу дать совет


15-1317018419
OW
2011-09-26 10:26
2012.01.29
Еще одна мечта появилась. Арбалет.


2-1318774430
igorium
2011-10-16 18:13
2012.01.29
Как нарисовать на канве картинку, скруглив у неё края