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
Cet Exe peut être compilé pour deux logiciels séparés utilisant des répertoires et BDR différentes !
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
Je suis en "BIDULE" en ce moment !
le moindre accès à une chaine définie par ces macros provoque un avertissement CodeGuard :
Je suppose que cela correspond à Sur-dépassement Accès mais sur une constante chaine ???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.
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 ?
Partager