Bonjour à tous,

Mon projet utilise une bibliothèque de type importé (fichier TLB) me permettant d'appeler des méthodes distantes sur un serveur COM mais également de recevoir des événements entrants depuis ce serveur COM.

Seulement voilà, le fait d'utiliser des composants générés de cette bibliothèque de type (des classes héritant de TOleServer) m'entraînent systématiquement des fuites mémoire.

En effet un rapport mémoire de FastMM m'indique la chose suivante :
4048E6 [System.pas][System][@GetMem][3693]
40556F [System.pas][System][TObject.NewInstance][11044]
405B02 [System.pas][System][@ClassCreate][12121]
59F104 [OleServer.pas][OleServer][TServerEventDispatch.Create][117]
20036
59F3DE [OleServer.pas][OleServer][TOleServer.Create][253]
59FDD0 [U_OleTools.pas][U_OLETools][TDiaOleServer.Create][254]
5CE158 [DiaServeur_TLB.pas][DiaServeur_TLB][TDiaConnexion.Create][35256]
658F6C [U_DiaCore.pas][U_DiaCore][TDiaCore.Create][1928]
6F264E
406B58 [System.pas][System][InitUnits][15458]
406BC4 [System.pas][System][@StartExe][15523]
40B9B7 [SysInit.pas][SysInit][@InitExe][770]
6F3410
755033CA [BaseThreadInitThunk]
77689ED2 [Unknown function at RtlInitializeExceptionChain]
77689EA5 [Unknown function at RtlInitializeExceptionChain]
Le bloc était actuellement utilisé pour un objet de la classe: TServerEventDispatch


En vérité le simple fait d'utiliser une instance "TOleServer" utilisant en interne une instance de "TServerEventDispatch " entraîne une fuite mémoire. J'ai essayé depuis pas mal de temps de savoir d'où cela provenait, mais tout ce que j'ai pu voir c'est que j'ai des appels à "TServerEventDispatch.QueryInterface(const IID: TGUID; out Obj)" (en provenance de la dll "ole32.dll" ou "auto32.dll" je crois), qui entraine un appel un 'TObject.GetInterface(const IID: TGUID; out Obj)' entrainant un incrément sur le nombre de référence qui n'est pas suivi décrémentation du nombre de référence correspondant. Comme si l'objet "Obj" retourné n'était pas libéré. Le problème c'est que cette récupération de l'objet semble être provoqué par une dll Windows et que je n'ai donc à priori pas de moyen de contrôler/corriger cela.
Je pense qu'il doit y avoir un problème dans mon code, ou à la limite avec la VCL, enfin quelque chose que je pourrais corriger...

Quelqu'un aurait-il des idées sur la manière de corriger cela ? Merci par avance.

Je suis surpris de ne rien trouver sur Internet concernant ce problème et c'est pourquoi je créé ce topic.