2013-02-27 3 views
0

Я пытаюсь создать dll, содержащую модуль данных VCL - идея состоит в том, что различные приложения могут загружать одну и ту же DLL и использовать один и тот же код базы данных.C++ Builder XE2: Инициализация модуля данных в dll

Сам модуль данных проверен как часть приложения - я скопировал форму в проект dll.

Таким образом, в методе точки входа DLL, мне нужно инициализировать модуль данных:

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) 
{ 
    //if I don't call this, I get an exception on initializing the data module 
    CoInitialize(NULL); 

    //initialize a standard VCL form; seems to works fine 
    //I'm not using Application->CreateForm as I don't want the form to appear straight away 
    if(!MyForm) MyForm = new TMyForm(Application); 

    //this doesn't work - the thread seems to hang in the TDataModule base constructor? 
    //I've also tried Application->CreateForm; same result 
    if(!MyDataModule) MyDataModule = new TMyDataModule(Application); 

} 

Я также видел что-то о том, как мне нужно позвонить APPLICATION-> Initialize перед созданием формы, но это Безразлично Кажется, не имеет никакого значения.

Любые идеи?

Благодаря

+0

Это может быть или не быть релевантным: я могу инициализировать пустой модуль данных без проблем. Мой фактический модуль данных содержит ADOConnection и ADOQuery - как только я добавляю их, проблема начинается – user1898153

+0

У меня была аналогичная проблема при использовании компонентов ADO в потоках. Для этого требовалось CoInitialize. Не знаю, поможет ли это в вашем случае, но попробуйте. – Tracer

ответ

0

Вы действительно не должны делать очень много работы в вашем DllEntryPoint() вообще. Конечно, не звоните CoInitialize(), во всяком случае. Ответственность DLL не связана с загрузкой. Это ответственность вызывающего приложения перед загрузкой библиотеки DLL.

Вы должны либо:

  1. экспорт дополнительные функции для инициализации DLL и затем приложение его после загрузки DLL (то же самое для uninitialing в DLL перед выгрузкой его)

  2. Дон» t создайте свой TForm/TDataModule до тех пор, пока им не понадобится DLL.

  3. переместите ваш TForm/TDataModule в свой рабочий поток внутри библиотеки DLL. В этом случае вы должны позвонить CoIniitalize().

И во всех случаях, не ретранслировать на Application объекте DLL, чтобы управлять срок службы вашего TForm/TDataModule. Освободите их самостоятельно, прежде чем DLL будет выгружена.