** Petr |
Отправлено: 24.11.2004, 23:14 |
|
Не зарегистрирован
|
Проблема в следующем:
создаю dll с одной элементарной функцией, которая, просто заносит новую строку в Params компонента Database. Но при вызове на этой строке генерируется исключение "Access violation... Read of address FFFFFFFF". Что за ерунда?
Может обращение к БД через dll-функции какое-то особенное?
|
|
pagan |
Отправлено: 25.11.2004, 09:25 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 22
|
QUOTE | Может обращение к БД через dll-функции какое-то особенное? | нет!
А как организуется сессия в DLL? |
|
AVC |
Отправлено: 25.11.2004, 09:27 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Сообщение Read of address FFFFFFFF в 99.9% случаев говорит о том что вы работаете через указатель, которому не присвоено значение (равен NULL). Посмотрите внимательно текст на предмет такой ошибки. |
|
olegenty |
Отправлено: 25.11.2004, 12:09 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
маячок: если в DLL используется некоторая глобальная переменная, хранящая общий указатель на компонент-БД, то она имеет собственную копию для каждого подключившегося процесса. отсюда вывод: эту глобальную переменную невредно помещать в разделяемую (расшаренную) область.
|
|
** Petr |
Отправлено: 25.11.2004, 19:55 |
|
Не зарегистрирован
|
QUOTE (olegenty @ 25/11/2004, 13:11) | эту глобальную переменную невредно помещать в разделяемую (расшаренную) область. |
Пардон, но я не в курсе, что это значит, не мог бы ты пояснить? |
|
** Petr |
Отправлено: 25.11.2004, 20:00 |
|
Не зарегистрирован
|
А DLL-ка очень простая, например:
UDM.h:
class TDMOD : public TDataModule
{
__published: // IDE-managed Components
TDatabase *Database;
private: // User declarations
public: // User declarations
__fastcall TDMOD(TComponent* Owner);
};
DLL.CPP:
include "UDM.h"
void f1()
{
DMOD->Database->AliasName = "BCDEMOS";
}
Dll.h:
extern "C" __declspec(dllexport) void f1();
Вызов:
void __fastcall TForm1::FormShow(TObject *Sender)
{
f1();
}
Вот и все, тут в качестве примера AliasName, но вообще вылетает при любом обращении. Может у меня настройки какие-то неправильные??
|
|
** Petr |
Отправлено: 25.11.2004, 20:03 |
|
Не зарегистрирован
|
А DLL-ка очень простая, например:
UDM.h (DataModule):
class TDMOD : public TDataModule
{
__published: // IDE-managed Components
TDatabase *Database;
private: // User declarations
public: // User declarations
__fastcall TDMOD(TComponent* Owner);
};
DLL.CPP:
include "UDM.h"
void f1()
{
DMOD->Database->AliasName = "BCDEMOS";
}
Dll.h:
extern "C" __declspec(dllexport) void f1();
Вызов:
void __fastcall TForm1::FormShow(TObject *Sender)
{
f1();
}
Вот и все, тут в качестве примера AliasName, но вообще вылетает при любом обращении. Может у меня настройки какие-то неправильные??
|
|
AVC |
Отправлено: 26.11.2004, 09:29 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
А dll'ка загружена?
А экземпляр TDMOD создан? (самая вероятная причина)
А отладчиком смотрели — вы до строки DMOD->Database->AliasName = "BCDEMOS" доходите?
Отредактировано AVC — 26/11/2004, 09:33 |
|
olegenty |
Отправлено: 26.11.2004, 14:08 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
вот и я думаю — не создан.
либо то, что я уже сказал.
когда в DLL объявляешь глобальную переменную, то неверно считать, что её значение одно единственное на все процессы. на самом деле — для каждого своя копия. до тех пор, пока ты явно не поместишь её в SHARED сегмент.
|
|
EisenMax |
Отправлено: 26.11.2004, 20:21 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 4
|
Большое спасибо, подсказка на тему разделенной области помогла. |
|