1 dll - 2 exe (3 possibilités ;o) )

cs_sena Messages postés 126 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 15 février 2005 - 5 mai 2003 à 10:51
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 - 7 mai 2003 à 14:03
Bonjour,

voila j'ai construit une dll.
Au chargement de cette dll un thread est lancer pour pouvoir effectuer une réception UDP en permanence.

Mon pb est lorsque 2 exe chargent cette même dll, car le thread est lancé 2 fois et il ne faut surtout pas ke ca se fasse car sinon ca fait 2 fois la même choz et en plus ca plante ....

Donc j'aimerais savoir si il y a un moyen de tester au chargement de la dll si le thread n'a po déjà été lancé lors d'un précédent chargement par un otre exe, ou alors tester si un port n'est pas déjà utilisé ....

Enfin pour l'instant mon idée est de passé par un fichier. Mon appli utilise un fichier .ini , je pense m'en servir en mettant une variable a 0 par défaut et a 1 lorsque le thread est lancé. Je sais c'est po top mais pour l'instant je sèche...

Merci de bien vouloir m'aider.
None.

6 réponses

CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
7 mai 2003 à 04:23
La fonction DllMain permet de tester si la DLL est déjà chargée

Core Breaker :)
0
cs_sena Messages postés 126 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 15 février 2005
7 mai 2003 à 09:24
Comment ca peux tu etre plus clair STP, je ne vois pas ce que tu vex dire.

Merci
0
cs_sena Messages postés 126 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 15 février 2005
7 mai 2003 à 10:44
Voila mon code:

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved )
{
DWORD threadID;
HANDLE hThread = 0;

switch( ul_reason_for_call ) {

case DLL_PROCESS_ATTACH:
//hThread = CreateThread(NULL, 0, Fct_UDP, NULL,
0, &threadID);
break;

case DLL_THREAD_ATTACH:
break;

case DLL_THREAD_DETACH:
break;

case DLL_PROCESS_DETACH:
//CloseHandle(hThread);
break;
}

return TRUE;
}

Quand je mets les deux lignes qui la sont en commentaire, j'ai une erreur : "La mémoire ne peut pas etre read ......."
Je croyais ke ca venait de mon CloseHandle(hThread) mais si je le mets en commentaire ca ne change rien.

En fait j'ai trouvé mon erreur elle ne vient pas du chargement de ma dll mais de mon thread.
En effet, j'ai mi la création de ce thread dans une fonction. Et j'ai le meme bug. JE croyais ke CloseHandle(hThread) servait a terminer mon thread,
APPAREMMENT NON.

Merci
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
7 mai 2003 à 12:07
Oui bien sûr:
BOOL WINAPI DllMain(
  HINSTANCE hinstDLL,  // handle to DLL module
  DWORD fdwReason,     // reason for calling function
  LPVOID lpvReserved   // reserved
)
{
static int instanceCount= 0;

switch(fdwReason)
{
case DLL_PROCESS_ATTACH:
  instanceCount++;
  break;
DLL_PROCESS_DETACH:
  instanceCount--;
  break;
}
}

...

if( instanceCount > 1 )
{
// DLL Déjà Chargée Thread déjà lancé
}
else
{
// DLL chargé pour la première fois
// Lancement du thread
}

Core Breaker :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_sena Messages postés 126 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 15 février 2005
7 mai 2003 à 13:39
Ah oui ok,

tu te sert d'un compteur !
Merci beaucoup pour l'idée !

;o)
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
7 mai 2003 à 14:03
Oui, c'est le même principe qu'un sémaphore mais sans lock

Core Breaker :)
0
Rejoignez-nous