Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с DLL

2.9K
01 мая 2004 года
Antisly
58 / / 22.04.2004
Статически подключаю к проекту DLL. Во время отладки программы все работает нормально. Но как только делаю окончательный билд (отключаю Linker page: "Create debug information", "Use dynamic RTL"; Packages page: "Build with runtime packages") и запускаю программу, то при выходе из нее выскакивает ошибка "Инструкция по такому-то адресу обратилась к памяти по эдакому адресу. Память не может быть 'read'." Причем если тот-же самый код использовать не из DLL, а вставить в виде юнита, то все работает нормально.
Если кто знает, в чет тут заморочка, - буду премного благодарен.
4.2K
01 мая 2004 года
mvvcpp
19 / / 17.09.2003
Цитата:
Originally posted by Antisly
Статически подключаю к проекту DLL. Во время отладки программы все работает нормально. Но как только делаю окончательный билд (отключаю Linker page: "Create debug information", "Use dynamic RTL"; Packages page: "Build with runtime packages") и запускаю программу, то при выходе из нее выскакивает ошибка "Инструкция по такому-то адресу обратилась к памяти по эдакому адресу. Память не может быть 'read'." Причем если тот-же самый код использовать не из DLL, а вставить в виде юнита, то все работает нормально.
Если кто знает, в чет тут заморочка, - буду премного благодарен.



Дык если отключена опция "Use Dynamic RTL", то бибилотеки должны быть включены в код (советую включить эту опцию)

2.9K
01 мая 2004 года
Antisly
58 / / 22.04.2004
Цитата:
Originally posted by mvvcpp

Дык если отключена опция "Use Dynamic RTL", то бибилотеки должны быть включены в код (советую включить эту опцию)


Советую внимательно прочитать хэлп по опции "Use Dynamic RTL":
"Use dynamic RTL means to use the RTL DLL, which is the DLL version of the Runtime Library in your application (or dll/package/ActiveX control). If you enable the option, the RTL code isn’t linked into your application, resulting in a smaller image, but you must distribute the RTL DLL with your application. This option defines the conditional define _RTLDLL."
Насколько я понимаю, там говорится примерно следующее: "Если опция включена, в проекте будут использоваться RTL DLL, но тогда их придется включать в дистрибутив. Если отключена - не придется, т.к. компоновщик включит необходимый код в .EXE".

10
02 мая 2004 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by Antisly
Если кто знает, в чет тут заморочка, - буду премного благодарен.


Могу сказать почти со стопроцентной уверенностью - проблема в приеме/передаче AnsiString. Нужно или всегда использовать динамические библиотеки выполнения, или задействовать ShareMem.
Есть также два других сильнодействующих средства - инициализировать менеджер памяти DLL вручную или собрать собственную библиотеку времени выполнения. Если проект состоит из многих DLL, рекомендовано второе.

2.9K
02 мая 2004 года
Antisly
58 / / 22.04.2004
Цитата:
Originally posted by smartsoft
Могу сказать почти со стопроцентной уверенностью - проблема в приеме/передаче AnsiString.



Во избежание проблем я в DLL не использовал тип AnsiString. Правда из нее инициируются исключения, производные от Exception (у которого, как известно, в качестве типа аргумента конструктора используется AnsiString), но классы этих исключений определены в заголовочном файле и, следовательно, из DLL не экспортируются. Правда некотроые члены классов библиотеки возвращают типы, в которых этот AnsiString используется, но опять же, он используется не в качестве членов, аргументов или типов возвращаемых значений, а для той же генерации исключений (которые опять же определены в заголовочных файлах).
P.S. Или все же причина - Exception?

10
02 мая 2004 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by Antisly
Правда некотроые члены классов библиотеки возвращают типы, в которых этот AnsiString используется, но опять же, он используется не в качестве членов, аргументов или типов возвращаемых значений, а для той же генерации исключений (которые опять же определены в заголовочных файлах).


Если библиотека экспортирует классы, порожденные от TComponent, использование AnsiString неизбежно - оно происходит неявно. Насчет исключений не уверен, но если библиотека сама не отрабатывает исключения, и они являются штатной ситуацией в ее работе (например, при обращении к файлам или базе данных), это также приводит к неявному использованию AnsiString.

1
03 мая 2004 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by Antisly

Насколько я понимаю, там говорится примерно следующее: "Если опция включена, в проекте будут использоваться RTL DLL, но тогда их придется включать в дистрибутив. Если отключена - не придется, т.к. компоновщик включит необходимый код в .EXE".


А опции компиляции ДЛЛ и проекта совпадают? Я имею ввиду - Use dinamic RTL отключено в обоих проектах?

2.9K
04 мая 2004 года
Antisly
58 / / 22.04.2004
Цитата:
Originally posted by kot_

А опции компиляции ДЛЛ и проекта совпадают? Я имею ввиду - Use dinamic RTL отключено в обоих проектах?



Да, все совпадает. Но заметил такую странность - когда при компиляции проекта и DLL включаешь "Use dynamic RTL", то все работает нормально. А где взять эти самые DLL RTL (чтобы включить в дистрибутив) я так и не нашел. :-(

1
04 мая 2004 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by Antisly


Да, все совпадает. Но заметил такую странность - когда при компиляции проекта и DLL включаешь "Use dynamic RTL", то все работает нормально. А где взять эти самые DLL RTL (чтобы включить в дистрибутив) я так и не нашел. :-(


Это библиотеки которые содержат импортируемые из билдера функции. Чтобы посмотреть какие именно нужны - в командной строке набираешь tdamp tvoi.exe > listing и внимательно смотришь. тоже самое нужно делать и для длл. они как правило находятся в бин-директории

2.9K
04 мая 2004 года
Antisly
58 / / 22.04.2004
Цитата:
Originally posted by kot_
... в командной строке набираешь tdamp tvoi.exe > listing и внимательно смотришь.


Набрал "myapp.exe > listing", появилось пустое досовское окно (коим оно и оставалось). После закрытия программы появился (опять же пустой) файл listing. И все. Кстати, что такое "tdamp"?
P.S. Проблема остается.

10
04 мая 2004 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by Antisly
Кстати, что такое "tdamp"?


TDUMP - Turbo Dump. Программа, существующая с незапамятного времени и показывающая зависимости файлов программ и библиотек. В папке Bin Билдера есть файл tdump.exe. Это и есть искомая программа. У нее два параметра - имя исследуемого файла, после чего можно задать необязательное имя файла результатов. Если файл результатов не задан, они выводятся на экран.
Полученный файл результатов можно посмотреть в любом текстовом редакторе, в Блокноте, или даже в самом Билдере, и понять, от каких статически подключаемых библиотек зависит твоя программа.

2.9K
05 мая 2004 года
Antisly
58 / / 22.04.2004
Understand. Всем спасибо. Нашел необходимые RTL DLL и включил их в дистрибутив. Все работает. Вот только дистрибутив "распух" в полтора раза.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог