2013-02-27 3 views
0

Je tente de créer une DLL contenant un module de données VCL. L'idée est que diverses applications peuvent toutes charger la même DLL et utiliser le même code de base de données.C++ Builder XE2: initialisation d'un module de données dans une DLL

Le module de données lui-même est testé dans le cadre d'une application - J'ai copié le formulaire sur mon projet dll.

Ainsi, dans la méthode du point d'entrée de dll, je dois initialiser le module de données:

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); 

} 

J'ai aussi vu quelque chose sur la façon dont je dois appeler Application-> Initialiser avant de créer la forme, mais ce doesn ne semble pas faire la différence.

Des idées?

Merci

+0

Cela peut ne pas être pertinent: je peux initialiser un module de données vide sans problème. Mon module de données réel contient un ADOConnection et un ADOQuery - dès que j'ajoute ceux-ci le problème commence – user1898153

+0

J'ai eu le même problème lors de l'utilisation de composants ADO dans les threads. Il a fallu que CoInitialize soit appelé. Je ne sais pas si cela aiderait dans votre cas, mais essayez .. – Tracer

Répondre

0

Vous devriez vraiment pas faire un travail très bien dans votre DllEntryPoint() du tout. Certainement pas appeler CoInitialize(), de toute façon. Ce n'est pas la responsabilité de la DLL d'appeler cela lorsqu'elle est chargée. C'est la responsabilité de l'application appelante avant de charger la DLL.

Vous devez soit:

  1. exportation d'une fonction supplémentaire pour initialiser votre DLL et ensuite l'application après le chargement de la DLL (même pour uninitialing la DLL avant de déchargement)

  2. don » t créez votre TForm/TDataModule jusqu'à la première fois que la DLL en a vraiment besoin. Déplacez votre TForm/TDataModule dans leur propre thread de travail dans la DLL. Dans ce cas, vous appelez alors CoIniitalize().

Et dans tous les cas, ne relaie pas sur l'objet Application de la DLL pour gérer la durée de vie de votre TForm/TDataModule. Libérez-les vous même avant que la DLL ne soit déchargée.

Questions connexes