[Delphi 7 DLL] Changement sauvage d’ID de Thread en cours d’exécution !

, par  ramal

Contexte :

J’ai une DLL win32 multithread écrite en Delphi 7.

Elle est appelée par une application ASP.NET 1.1 (Delphi 2006)

Tout va bien quand l’application ASP.NET tourne hors debugger, mais les fonctions de la DLL plantent ou terminent sur erreur de manière aléatoire quand l’application ASP.NET tourne dans l’environnement Delphi 2006 !

Cause :

En analysant les sorties sur DebugView, je me suis rendu compte que quand l’application ASP.NET tourne sous debugger, il arrive que l’ID du thread change subitement pendant l’exécution d’une fonction de la DLL ce qui provoque rapidement une erreur.

En fait, il semble que sous ce debugger, l’ID de thread de l’application peut changer à tout instant.

La DLL win32 utilisait la fonction GetCurrentThreadID() de l’API windows pour accéder à ses ressources nommées en considérant que l’id ne changeait pas au cours de l’exécution d’un appel d’une fonction de la DLL win32.
Ce qui est faux dans certains contextes (sous debugger dans notre cas).

Solution :

Mémoriser l’ID du Thread dans une variable de thread (ThreadVar sous Delphi) et l’utiliser ensuite au lieu de faire appel à la fonction GetCurrentThreadID().

Exemple de code (incomplet) :