Bug avec une fiche dans une dll et thème XP

Résolu
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 12 août 2006 à 14:21
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 26 août 2006 à 10:35
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

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
24 août 2006 à 11:12
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.
3
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
12 août 2006 à 17:12
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.
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
12 août 2006 à 17:32
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.
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
12 août 2006 à 17:32
@ 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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
12 août 2006 à 17:35
oups, j'avais pas rafraîchi avant de poster ... ça fesait longtemps

content d'avoir pu vous rendre service

@+
Cirec
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
16 août 2006 à 15:00
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 !
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
19 août 2006 à 14:46
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...
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
19 août 2006 à 21:24
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.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
23 août 2006 à 11:19
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.
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
24 août 2006 à 12:11
Mais elle venait d'ou l'exception

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

@+
Cirec
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
26 août 2006 à 10:35
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).
0
Rejoignez-nous