Bug avec une fiche dans une dll et thème XP [Résolu]

Signaler
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
Bonjour,

Je ne parviens pas à utiliser une fiche dans une dll possédant un GroupBox utilisée dans une appli utilisant le thème XP.


(Rien n'est optionnel dans la phrase ci-dessus : certains composants ne posent pas de problèmes, pas de problèmes non plus sans thème XP...)


Une exception (violation d'accès) à lieu à la fermeture de l'application (Autrement dit bien après la destruction théorique de la fiche).


Je vais décrire la procédure pas à pas pour aboutir à ce problème :


1 Démarrer un projet à partir de l'expert dll.


2 Cliquer sur nouvelle fiche, puis renommer :


L'unité en Unit2.
La form en Form2 à partir de l'inpecteur d'objet (La classe sera renommée TForm2 automatiquement).


3 Placer un GroupBox sur la form.


4 Mettre ce code dans l'unité de la librairie :


//--------------------------------------------------------
library Project2;


uses
  SysUtils,
  Classes,
  Unit2 in 'Unit2.pas' {Form2};


{$R *.res}


procedure allo(); stdcall;
begin
  Form2:= TForm2.Create(nil);
  Form2.ShowModal;
  Form2.Release;
end;


exports
  allo;


begin
end.
//--------------------------------------------------------


5 Sauvegarder et compiler.


6 Menu 'projet', puis 'Ajouter un nouveau projet', puis 'Application'.


7 Sur la fiche de l'application, placer un XPManifest, puis un bouton.


8 Déclarer la procédure de la dll dans la clause interface de l'unité de la fiche de l'application.


//--------------------------------------------------------
procedure allo(); stdcall; external 'Project2.dll';
//--------------------------------------------------------


9 Double cliquer sur le bouton pour implémenter ça :


//--------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
  allo;
end;
//--------------------------------------------------------


10 Sauvegarder et compiler. On peut le faire dans le même répertoire que celui de la dll sans problème a priori.


11 Executer l'appli.


12 Cliquer sur le bouton de la fiche.


La deuxième form s'affichera correctement, avec sa groupbox.
Sa fermeture par la croix devrait se passer sans problème elle aussi.
C'est la fermeture de la form de l'appli qui devrait être anormalement longue pour aboutir à ce message :


Le projet ... a provoqué trop d'exceptions consécutives : 'access violation at 0x003330de: read of address 0x00953e38'.


Snif.


Voilou voilou.


A noter que si on retire le composant XPManifest, l'appli reste XP. Il faut supprimer l'unité XPMan de la clause uses pour revenir à une appli normale (qui fonctionnera tout à fait correctement).


Le fait de ne pas libérer la fiche (En n'appelant pas Release) ne change rien.
Le fait d'ajouter un composant XPManifest sur la fiche de la dll ne change rien.
Le fait d'utiliser la méthode CreateForm de l'objet Application pour créer la fiche ne change rien.


A noter aussi que c'est le dessin du groupbox qui semble poser problème, en effet :
//--------------------------------------------------------
procedure allo(); stdcall;
begin
  Form2:= TForm2.Create(nil);
  Form2.GroupBox1.Visible:= False;
  Form2.ShowModal;
  Form2.Release;
end;
//--------------------------------------------------------
fonctionne parfaitement.


Merci d'avance.


 


 




 

11 réponses

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
Yahuuuu  !

Avant d'abandonner, j'ai quand même essayé d'en savoir un peu plus... Je me suis dit que charger et décharger la dll dynamiquement (Manuellement quoi) me permettrait par exemple de savoir si l'exception à lieu au déchargement de l'exe ou à celui de la dll...

Et là, très bonne surprise : pas d'exception !!!!!

Voilou voilou, donc fin du problème en ce qui me concerne !

PS :
Comme c'est très chiant de rédiger le code de chargement dynamique, j'ai fait une appli qui s'en charge.
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
27
Salut,

Le problème est connu et il n'y a pas de solution à ce jour.
Pour avoir moi-même longtemps cherché pourquoi une AV était déclenchée puis, sur le net, s'il existait une solution, je peux te donner comme conseil de laisser tomber.
Il et reste deux solutions :
1/- rapatrier ta fiche dans ton exe
2/- renoncer à l'utilisation des thèmes XP

Je crois me souvenir, mais là je ne suis plus trop sur de moi, que le problème persiste avec Delphi 2005.

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
27
Alors là, Cirec, tu me scotches littéralement !
Je suis complétement passé à côté du code de Shining alors que je regarde tout (ou presque) ce qui passe sur DelphiFr.
Je viens de regarder son code et ça marche nickel !
Et dire que j'ai passé du temps à chercher comment régler ce problème alors que la solution était là, à portée de clic et en français ! 
Merci pour cette info.

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
18 mai 2020
29
@ Delphiprog : Une petite fatigue peut être ?

J'ai fait le teste avec la source de Shining et ça fonctionne très bien ?
Il est vrai qu'il n'utilise pas la même méthode !
Essaye ça devrait fonctionner !

Si vous téléchargez la source après décompression il faut créer deux répertoires "\EXE" et "\DCU" dans le répertoire ou se trouve DllDemo.dpr, sinon il ne voudra pas compiler, et suivre les instructions dans LisezMoi.txt 

Voilà c'est tout  

@+
Cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
18 mai 2020
29
oups, j'avais pas rafraîchi avant de poster ... ça fesait longtemps

content d'avoir pu vous rendre service

@+
Cirec
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
Houps, pardon cirec de pas avoir cherché... C'est que ces temps ci, je paye chaque minute de connexion... Ca me donne pas envie de m'éterniser... Merci pour le lien !
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
Argl...

Après éssai, le source fonctionne parfaitement avec son Mémo et ses deux boutons, mais ne marche pas avec les composants qui me posaient problème.

Merci quand même de vous être interressé à mon cas.

Je vais suivre ton conseil Delphiprog -> Laisser tomber...
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
27
Ah non alors !
Mon conseil a été donné faute de ne pas avoir connu la solution au moment où j'en avais le plus besoin.
Maintenant qu'on tient une solution viable, ce serait dommage de renoncer.
Avec quels composants rencontres-tu toujours le problème ?

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
J'ai une exception à la fermeture de l'appli quand la fiche a au moins un des composants suivants, que ce soit avec le code ci-dessus ou avec le source du lien de cirec :

SpeedButton
RadioGroup
GroupBox
StringGrid

Et y en a certainement d'autre.

Le source de cirec, c'est plus comment faire des fiches MDI dans une dll (Ce qui n'était pas évident d'ailleurs) : elle ne résoud a priori rien en ce qui concerne le problème du thème XP.
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
18 mai 2020
29
Mais elle venait d'ou l'exception

Voici la bonne question qu'il fallait se poser ... tu as pris la solution de "facilité" ....

@+
Cirec
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
Bah vi lol.

Met toi à ma place : si DelphiProg à pas trouvé, je vais pas chercher !

En tout cas c'est a priori que la dll est déchargée après une partie de l'exe, et que cette partie est nécessaire au déchargement de la dll. (Vut que si on décharge la dll manuellement puis l'exe, on a pas de problème).