Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > AnsiString в библиотеке. Ошибка при выходе


Автор: Belerafon 4.7.2007, 10:44
Re. Вопрос. BCB6. Делаю библиотеку и программу, ее использующую. Статическая линковка. Если в библиотеке начать использовать AnsiString (объявляю одну локальную переменную и никуда не передаю), то при выходе из основной программы получаю RunTime Error 204 (неправильный указатель). 

Вот код библиотеки: 
Код

#define _DLLMAINCPP
#include <windows.h>
#include <Classes.hpp>

#include "Zlib.h"

#pragma package(smart_init)
#pragma hdrstop

AnsiString test;

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
    return 1;
}

void _export TestFunc(int test){

}







В основоной программе просто добавляю проект lib файл, а затем вызываю (просто так) TestFunc. При выходе из программы получаю ошибку. AnsiString, где бы не объявлял, вызывает ошибку. Без нее все работает. Пробовал sharemem, не помогает. Так же пробовал использовать класс TThread, при его объявлении такая же история. Хотя и программа и библиотека работают без проблем. Вот только при выходе...

Почему так? Какие еще варианты попробовать? Другие виды строк не устраивают - все равно нужно будет использовать TThread, а проблема судя по всему общая, что-то с классами...

Автор: Lazin 4.7.2007, 11:56
А как линкуется RTL к библиотеке и программе?
(опция Lincker - Use dynamic RTL )

Автор: JackYF 4.7.2007, 14:23
Lazin, тебе надо подрубить, кажется, BCBMM.dll и lib, что-то вроде этого...
А вообще лучше не пользоваться передачей параметров AnsiString из/в библиотеке, об этом Борланд пишет (писала, по крайней мере).

Сделай лучше std::string или char* на худой конец.

Автор: Lazin 4.7.2007, 15:00
Цитата

А вообще лучше не пользоваться передачей параметров AnsiString из/в библиотеке

при чём здесь это, он просто глобальную переменную создал, никуда не передавал. Ошибка происходит при её удалении.

Автор: Fazil6 4.7.2007, 15:11
Цитата(JackYF @  4.7.2007,  14:23 Найти цитируемый пост)
А вообще лучше не пользоваться передачей параметров AnsiString из/в библиотеке, об этом Борланд пишет (писала, по крайней мере).Сделай лучше std::string или char* на худой конец.

ну во первых std::string по большому счету ничем не лучше AnsiString в таком варианте 
и во-вторых где ты тут видишь вообще передачу строк? 

Автор: Lazin 4.7.2007, 15:20
можно попробовать с линковать dll и exe, с динамической CRTL, за удаление глобальных переменных именно она и отвечает.

Автор: JackYF 4.7.2007, 15:56
Цитата(Fazil6 @  4.7.2007,  15:11 Найти цитируемый пост)
и во-вторых где ты тут видишь вообще передачу строк?  

да, тут промазал. Пардон.

Цитата(Fazil6 @  4.7.2007,  15:11 Найти цитируемый пост)
ну во первых std::string по большому счету ничем не лучше AnsiString в таком варианте 

не спорю. Но попробовать стоит, может, уйдет ошибка.

Автор: Belerafon 6.7.2007, 10:39
Спасибо. Проблема решилась снятием галочки "Use dynamic RTL" в основной программе. После этого ошибка попала.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)