Sur C++Builder 2007, je m'occupe d'un projet dont certains modules sont des EXE utilis� en DCOM

En Debug, je lance l'Exe directement, donc pas de DCOM
Celui-ci contient un Thread Principal (VCL) et un Thread Secondaire
Dans le Thread Secondaire, � un moment donn� je lance un 3eme Thread
Dans ce 3eme Thread, j'utilise des Objets et des Interfaces (classes abstraites pures) qui sont impl�ment�es par plusieurs DLL

Les DLL via LoadLibrary sont charg�es dynamiquement en fonction de la DB (une sorte de syst�me de Proxy\Drivers pour pilotage de p�riph�rique avec une forte volont� de g�n�ricit�)

Apr�s le LoadLibray, je fais appel � proc�dure dont l'adresse est r�cup�r�e par GetProcAddress, une bonne s�quence de code s�ex�cute sans probl�me !
J'acc�de m�me � certaines des #define avec TRegistry

A un moment donn� j'utilise un objet commun � tous les projets, une sorte de boite � outil !
Des instances de cet objet ont �t� cr��es sans aucun soucis dans l'Exe ainsi que d'autres d'autres DLL d�j� charg�es !
Cet objet durant sa construction utilise des #define

Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
 
#ifdef VERSION_BIBULE
  #define KEY_ROOT_REG "SoftWare\\Bidule"
  #define NAME_APPLICATION "Bidule"
  #define VERSION_KEY "VersionBidule"
#else
  #define KEY_ROOT_REG "SoftWare\\Machin"
  #define NAME_APPLICATION  "Machin"
  #define VERSION_KEY "Version"
#endif
Cet Exe peut �tre compil� pour deux logiciels s�par�s utilisant des r�pertoires et BDR diff�rentes !
Je suis en "BIDULE" en ce moment !

le moindre acc�s � une chaine d�finie par ces macros provoque un avertissement CodeGuard :
Sur-d�passement Pointeur arithm�tique en cours de traitement : Programme.exe(15476) - ..\..\Machin\commun\ObjetBoiteOutil.cpp#2347
0x043A2D45+3118, qui est sur offset 424+3118 dans le bloc d'adresse 0x043A2B9D(=Truc.dll:0x02:000B9D) dont la longueur est seulement de 512 octets.
Je suppose que cela correspond � Sur-d�passement Acc�s mais sur une constante chaine ???
Comme si l'espace m�moire de la DLL n'�tait pas top top !

les fonctions utilisant ces #define sont RegOpenKeyEx, RegQueryValueEx, strcmpi, j'ai aussi test� strlen ou OutputDebugString !
Le code fonctionne parfaitement mais CodeGuard panique un peu !
Tout en version ANSI

le plus Etrange, j'ai d�plac� la cr�ation (je pratique le lazyloading) des mes objets et interfaces dans le Second Thread
Ce qui implicitement charge les DLL avec LoadLibray et appel des proc�dures r�cup�r�es pas GetProcAddress
Myst�re plus de probl�me avec CodeGuard !

J'ai aussi tent� de mettre le code du Execute comme une simple fonction non thread� directement dans le Thread Principal, disons que son comportement semble d�pendre de la pression atmosph�rique, un coup, CodeGuard ne dit rien, le coup suivant il m'affiche ces warnings !
Cela d�pend si je fais F7 (descente du pas � pas) ou F8 (pas � pas simple)

De plus, ces m�me objets et interfaces sont utilis�s dans deux autres ex�cutables, le chargement des DLL et l'appel de proc�dure ne posent aucun probl�me !

Questions (oui enfin) :
- Est-ce mal de faire un LoadLibrary depuis un Thread (lui m�me lanc� depuis un Thread)
- Est-ce juste CodeGuard qui panique avec les Threads ?