Форум: "Начинающим";
Текущий архив: 2012.01.29;
Скачать: [xml.tar.bz2];
Внизконфликт двух 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.keyunit 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;
Скачать: [xml.tar.bz2];
Память: 0.59 MB
Время: 0.025 c