Макс |
Отправлено: 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 — чёта не получилось у меня. Но попробую ещё |
|