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

 
Как открыть базу данных через DLL?
** 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



Большое спасибо, подсказка на тему разделенной области помогла.

Вернуться в Работа с базами данных в C++Builder