Дело о двух dll
Модератор: Модераторы
Дело о двух dll
Help, допоможіть, помогите!
Написал я на FPC две dll с функциями.
Использовал их в разных проектах... Но вот понадобилось мне в одном проекте использовать их вместе...
И вот вчём проблема. Проект использующий две мои длл-и даже не запускается. Пишет:
"Ошибка при инициализации приложения (0xc000007b). Для віхода из приложения нажмите кнопку ОК."
И это при том, что я даже ещё не вызываю никаких функций из этих библиотек. Вообщем я теряюсь в догадках.
Может кто знает, чо это может быть?
Написал я на FPC две dll с функциями.
Использовал их в разных проектах... Но вот понадобилось мне в одном проекте использовать их вместе...
И вот вчём проблема. Проект использующий две мои длл-и даже не запускается. Пишет:
"Ошибка при инициализации приложения (0xc000007b). Для віхода из приложения нажмите кнопку ОК."
И это при том, что я даже ещё не вызываю никаких функций из этих библиотек. Вообщем я теряюсь в догадках.
Может кто знает, чо это может быть?
-
first-leon
- новенький
- Сообщения: 68
- Зарегистрирован: 20.04.2006 18:46:31
- Контактная информация:
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
first-leon писал(а):Может функции из разных библиотек имеют одинаковые имена?
Исключено. В одной длл специально для этого все функции начинаются на phxl, в другой - на hf.
Возможно, что из-за указания неправильных ключей при компиляции dll-ки получились без таблиц релокации (.reloc).
Вполне может быть. Я пользовался средой Лазарус для написания. Вручную ключи я не выставлял. А какие это ключи?
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Странно... Очень странно...
Дело о двух dll приобретает мистический характер...
Когда я ставлю дллям -WB400000 и -WB410000. Происходит та же самая ошибка и, к тому же, длл-и отказываются работать даже по одной!
Просто параметр -WB у обоих дллей ничего не даёт.
Зато когда у одной длл стоит просто -WB, а у другой -WB410000 они прекрасно работают вместе, но та у которой -WB410000 уже не хочет работать одна...
Вот.
Я лично ничего не пойму...
Кстати, можно узнать что за смещения такие 410000 и 400000? Я пробовал ставить другие, но писало, что это не Win32 приложение или библиотека.
Это уже на крайняк. Да и интересно - в чём же дело.
Дело о двух dll приобретает мистический характер...
Когда я ставлю дллям -WB400000 и -WB410000. Происходит та же самая ошибка и, к тому же, длл-и отказываются работать даже по одной!
Просто параметр -WB у обоих дллей ничего не даёт.
Зато когда у одной длл стоит просто -WB, а у другой -WB410000 они прекрасно работают вместе, но та у которой -WB410000 уже не хочет работать одна...
Вот.
Кстати, можно узнать что за смещения такие 410000 и 400000? Я пробовал ставить другие, но писало, что это не Win32 приложение или библиотека.
Попробуй слить обе dll в одну.
Это уже на крайняк. Да и интересно - в чём же дело.
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Вообще, в предыдущем сообщении я малость прогнал: 400000 - это адрес загрузки .exe, для .dll обычно используют 10000000.
Интересно другое: я сейчас быстренько сляпал две .dll и программу, которая их использует. Скомпилировал безо всяких ключей вообще. Вс е работает, причем как при компиляции версией 2.1.1, так и версией 2.0.4. У обоих .dll базовый адрес один и тот же (10000000), но таблица релокации на месте. В связи с чем возникает вопрос уже о версии компилятора...
Интересно другое: я сейчас быстренько сляпал две .dll и программу, которая их использует. Скомпилировал безо всяких ключей вообще. Вс е работает, причем как при компиляции версией 2.1.1, так и версией 2.0.4. У обоих .dll базовый адрес один и тот же (10000000), но таблица релокации на месте. В связи с чем возникает вопрос уже о версии компилятора...
Код: Выделить всё
library lib;
procedure test1; stdcall;
begin
end;
exports Test1;
begin
end.
---
library lib2;
procedure test2; stdcall;
begin
end;
exports Test2;
begin
end.
---
program libtest;
procedure Test1; stdcall; external 'lib';
procedure Test2; stdcall; external 'lib2';
begin
test1;
test2;
end.
У меня Лазарь 0.9.16 бета. И с ним компилер 2.0.2.
Но меня всё-таки беспокоит SysUtils. Ведь две длл уживаются нормально тогда когда у одной из них (той из которой мне SysUtils удалить не удалось) при компиляции стояла директива -W410000.
Ладно попробую установить более новый компилер. Он у меня как раз где-то валялся. Не помню почему я его снёс.
Но меня всё-таки беспокоит SysUtils. Ведь две длл уживаются нормально тогда когда у одной из них (той из которой мне SysUtils удалить не удалось) при компиляции стояла директива -W410000.
Ладно попробую установить более новый компилер. Он у меня как раз где-то валялся. Не помню почему я его снёс.
Установил 0.9.2 - тоже самое.
Точно, Дело в Лазаре.
Точно, букву в букву повторил ваш код (через один пост сверху), скомпилил две длл (lib и lib2) с пустыми процедурами и проект, который их использует. И таже самая фигня... Вообщем попробую ещё поиграть с ключами, или сменить ИДЕ. Стандартное консольное ИДЕ уже несколько раз пытался использовать, но неудобно и всё тут, лично мне...
Точно, Дело в Лазаре.
Точно, букву в букву повторил ваш код (через один пост сверху), скомпилил две длл (lib и lib2) с пустыми процедурами и проект, который их использует. И таже самая фигня... Вообщем попробую ещё поиграть с ключами, или сменить ИДЕ. Стандартное консольное ИДЕ уже несколько раз пытался использовать, но неудобно и всё тут, лично мне...
Всё, проблема решена!
Оказывается дело было вот в чём.
Лазарь по умолчанию добавляет ключ -gl (выдать номера строк в ошибках времени исполнения). Это удобно обычно. Но вызывает сильное увеличение размеров ехе-шников. Я по привычке пользовался утилиткой strip чтоб очистить от лишнего веса свои длл, когда в отслеживании номеров строк необходимость отпадала. Но видно strip не до конца всё очищает и в памяти проекта рождается ещё какойто лишний следящий поток, причём этот поток (я так сабе это представляю) видимо пытается занять строго определённое место в памяти приложения, а так как длл хранят данные в памяти приложения, то несколько таких потоков от разных длл вступают в конфликт.
Так что если компилите в Лазаре длл отключайте
Проект->Опции компилятора->Связывание->выдать номера строк в ошибках времени исполнения
Оказывается дело было вот в чём.
Лазарь по умолчанию добавляет ключ -gl (выдать номера строк в ошибках времени исполнения). Это удобно обычно. Но вызывает сильное увеличение размеров ехе-шников. Я по привычке пользовался утилиткой strip чтоб очистить от лишнего веса свои длл, когда в отслеживании номеров строк необходимость отпадала. Но видно strip не до конца всё очищает и в памяти проекта рождается ещё какойто лишний следящий поток, причём этот поток (я так сабе это представляю) видимо пытается занять строго определённое место в памяти приложения, а так как длл хранят данные в памяти приложения, то несколько таких потоков от разных длл вступают в конфликт.
Так что если компилите в Лазаре длл отключайте
Проект->Опции компилятора->Связывание->выдать номера строк в ошибках времени исполнения
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
А у меня, а у меня...
С версией 2.0.4 этот простейший тест продолжает работать, и если компилить с -gl, и если потом делать strip. А версия 2.1.1 вообще не хочет компилить библиотеку с ключом -gl: Internal error 200603033.
Так что, похоже, дело не в -gl... Кстати, Лазарь должен сам делать strip, если соответствующую галку поставить. Но я ни разу этого не наблюдал, всегда приходится делать strip самостоятельно...
Так что, похоже, дело не в -gl... Кстати, Лазарь должен сам делать strip, если соответствующую галку поставить. Но я ни разу этого не наблюдал, всегда приходится делать strip самостоятельно...
