C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
MDI+DLL — в char*
Макс
Отправлено: 29.06.2005, 13:12


Не зарегистрирован







Есть приложение с дочерними окнами. Есть dll, в которой имеется ф-ция вытаскивающая из БД информацию и передающая (в виде структуры) в дочернее окно. После создания дочернего окна указатели char* в структуре начинают "плыть" (т.е. в строках появляется не та информация, которая была). Вот сокращённый листинг:

//структура для обмена
typedef struct Doc {
char Direct; //направоление док-та: "0" — входящий; "1" — исходящий; "3" — локальный
unsigned long Number;//ID
unsigned long LNumber;//ссылка из вход. на исход.
char* CDate; //дата поступления
char* Num; //номер
} RCLDoc;

//обработчик на главной форме
void __fastcall TMainForm::MWindDocClick(TObject *Sender)
{
int i=100000123;
RCLDoc D;
//запрашиваем данные о конкретном документе
try{
void (__stdcall *DBI_GetRCLDoc)(unsigned long, RCLDoc*);
DBI_GetRCLDoc=(void(__stdcall *) (unsigned long,RCLDoc*))GetProcAddress(DBIdll, "_GetRCLDoc"); //получаем адрес ф-ции
if (DBI_GetRCLDoc) DBI_GetRCLDoc(i,&D); //вызов ф-ции
else {
ShowMessage("Ошибка при получении данных о документе:\n"+SysErrorMessage(GetLastError())); //если ошибка
DocForm->Close();
return;
}
} catch (Exception &e) {Application->ShowException(&e);}

//поле CDate структуры содержит "17.03.2003"
DocList[i]=D;//двусвязный список map

TDocForm* DocForm=new TDocForm(this); //создаём дочернюю форму
//после этого места CDate меняет своё содержимое на что угодно

CreateDocForm(DBIdll,i); //заполняем дочернюю форму

DocForm->Show();
}

Может кто сталкивался с такой проблемой — помогите
olegenty
Отправлено: 29.06.2005, 13:42


Ветеран

Группа: Модератор
Сообщений: 2412



покажи тот кусок кода, который у тебя память под
char* CDate; //дата поступления
char* Num; //номер
выделяет...

если ты туда AnsiString::c_str() запихиваешь, то ты не прав... (но всё же хочется посмотреть)
Guest
Отправлено: 30.06.2005, 14:20


Не зарегистрирован







1. Пробовал вот так сразу после объявления RCLDoc D :

D.DiscrText=new char[100];
D.CDate=new char[10];

2. А как нужно запихивать AnsiString в char* ?
Guest
Отправлено: 30.06.2005, 14:24


Не зарегистрирован







Пардон — немного напутал (кучу вариантов переделал). Вот так:
D.CDate=new char[10];
D.Num=new char[9];

olegenty
Отправлено: 01.07.2005, 07:00


Ветеран

Группа: Модератор
Сообщений: 2412



c_str() нельзя просто присвоить, его надо скопировать. strcpy, например.
AnsiString::c_str() даёт "мгновенный" указатель на внутренний буфер, который перестаёт быть актуальным после ЛЮБОГО действия с AnsiString. если данные НЕ СКОПИРОВНЫ, то имеешь то, что ты и имеешь.
Guest
Отправлено: 01.07.2005, 14:23


Не зарегистрирован







Пробовал через strcpy — чёта не получилось у меня. Но попробую ещё

Вернуться в Вопросы программирования в C++Builder