fade96
Messages postés12Date d'inscriptionjeudi 9 février 2006StatutMembreDernière intervention29 avril 2006
-
4 avril 2006 à 03:46
fade96
Messages postés12Date d'inscriptionjeudi 9 février 2006StatutMembreDernière intervention29 avril 2006
-
29 avril 2006 à 00:51
Voila mon probleme
mon appli qui execute mes fonctions et procedures de ses dll produit une erreur a sa fermeture (exclusivement si j'ouvre une fiche de ma dll) ds "uxtheme.dll". il s'agirai donc du XPManifest du prog.
Malgré mes recherches, je n'ai pas vraiment trouvé de moyen de contourner le probleme dans le forum, je me permet donc de poser la question.
Pour ne pas encombrer les esprits, g representé le code que j'utilise dans une version "small":
function CallText(AppHandle: THandle): string;
var
LastHandle : Hwnd;
begin
LastHandle := Application.Handle;
Application.Handle := AppHandle;
if not Assigned(Form1) then
Form1 := TForm1.Create(Application);
if form1.ShowModal = mrOk then
Result := form1.Edit1.Text;
Form1.Release;
Application.Handle := LastHandle;
end;
Voila donc, je tourne en rond depuis un moment et j'aimerai trouver une solution tout en gardant XPMan dans les uses de mon prog. Quelqu'un aurait-il une methode ?
fade96
Messages postés12Date d'inscriptionjeudi 9 février 2006StatutMembreDernière intervention29 avril 2006 7 avril 2006 à 20:45
salut shining,
justement jav essayé avec ton source, mai le probleme persiste. je sais pour Form.Free mais telement dans le desespoir que j'ai essayé mainte et maintes alternatives...
si par hasard quelqu'un aurai une solution.............
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 8 avril 2006 à 15:35
j'ai fait le test et chez moi ça marche sans problème néanmoins il est préférable de ne pas mettre de type "String" dans tes paramètres windows travail essentiellement avec des Pchar
donc essai ceci
Form1.Free <== car Release n'attend pas la fermeture de la fiche et renvoie la "main" à son appelant mais c'est pas bien grave
function CallText(AppHandle: THandle): PChar;
et result := PChar(Form1.Edit1.Text);
Note : tu n'es pas vraiment obligé de passer par le PChar il faudra dans ce cas là mettre "ShareMem" dans ta clause uses mais en tout 1er
maintenant je ne pense pas que le problème provient de cette routine là ton code est imcomplet il doit y avoir un problème de pointeur juste avant la fermeture...
mais mon exemple tu la compilé ? et il te fait la même chose ?
car dans OnFormDestroy il ya une routine qui ferme correctement la session avec la DLL
j'ai l'impréssion que j'ai dla chance avec mon bon vieux Delphi6 ya jamais tous ces tracas :)
fade96
Messages postés12Date d'inscriptionjeudi 9 février 2006StatutMembreDernière intervention29 avril 2006 8 avril 2006 à 23:37
bon je reprend ton source depuis le debut en adaptant o mieu pour mon code et je te redis ca, je mettrai le source en post ici pour te montrer. merci pour ton aide
fade96
Messages postés12Date d'inscriptionjeudi 9 février 2006StatutMembreDernière intervention29 avril 2006 9 avril 2006 à 03:00
re-salut shining,
avant tout, merci pour tes precisions.
J'ai re-testé ton code avec quelques morceaux du mien qui m'interessais mai je me suis aperçu que ca emcombrerai enormement mes fonctions et procedures de ma librairie (ya pas mal de fonctions et procedures qui utilisent des forms ds ma DLL...).
Est-ce que tu saurai, par hasard, commen utiliser ton procedé directement dans la fonction elle-meme tel que:
function CallText: PChar;
begin
//bla bla bla etc...
if not Assigned(Form1) then
Form1 := TForm1.Create(Application);
if form1.ShowModal = mrOk then
Result := PChar(form1.Edit1.Text);
Form1.Free;
-> DLLEntryPoint(DLL_PROCESS_DETACH) par exemple.. end;
merci beaucoup !
++
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 27 avril 2006 à 09:35
Si j'ai bien lu, Shining utilise Delphi 6. Alors, avec Delphi 6, je n'ai pas de prblème non plus.
Je rencontre le même problème que Fade96 avec Delphi 7 et sans modifier mes projets.
Dès que l'on met le composant TXPManifest sur la fiche principale, on a droit à une AV à la fermeture de l'application : runtime error 216 at xxxxx.
Le problème semble connu et je n'ai pas trouvé de solution pour l'instant.
Mais dès que j'en trouve une, je me ferai un plaisir de vous la communiquer et gratos, svp
May Delphi be with you !
<hr color="#008000">
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 27 avril 2006 à 15:05
re-salut, oui effectivement j'ai la version 6 de Delphi et j'entends beaucoup parler du problème de XPMan avec les versions supérieurs !!! à croire que c'est un problème de la RTL ?? toujours est-il que XPMan n'a rien d'extraordinaire il ne fait qu'ajouter un fichier XML dans le resource de l'executable afin que windows XP(entre autre) puisse appliquer les bonnes versions de comctl32.dll ect... "contenu dans C:\WINDOWS\WinSxS"
néanmoins afin de preserver l'application ainsi que son ecran voici un conseil qui peut, peut-être bien marcher !!!
puis dans ta fonction CallText mets ceci comme paramètre
function CallText(App : TApplication; Scr : TScreen; var Text : PChar ): Boolean;
var
OldApp : TApplication;
OldScreen : TScreen;
begin
result := False;
Text := PChar('');// où nil
OldApp := App;
OldScreen := Scr;
Application := App;
Screen := Src;
// Application CreateForme s'assure que la classe a bien été correctement instancié et donc si Form1 est déja créer il n'y aura pas de seconde instance !!!
Application.CreateForm(TForm1 , Form1);
if form1.ShowModal = mrOk then
begin
Text := PChar(Form1.Edit1.Text);
result := True;
end;
Form1.Free;//
Application := OldApp;
Screen := OldScreen;
end;
Maintenant pour convertir le PChar en String il suffit de faire
var
Text : PChar;
begin
if CallText(Application , Screen , Text) then
Edit1.Text := StrPas(Text);// StrPas qui se trouve dans l'unité SysUtils
end;
.......
maintenant je ne dit pas que celà va marcher !!! néanmoins cette méthode semble la plus approprié pour une DLL contenant des fiches !!!
@+
fade96
Messages postés12Date d'inscriptionjeudi 9 février 2006StatutMembreDernière intervention29 avril 2006 27 avril 2006 à 15:13
J'ai deja essayé cette methode, rigoureusement bien sur, et ca ne m'as pas resolu mon probleme... je continu de chercher (car quand mm, petit point de detail qui a son importance dans les applis) et j'essayerai de proposer une autre solution.
Merci a vous pour vos essais.
Bonne prog, ++
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 28 avril 2006 à 22:51
Je crois que je me suis avancé un peu vite. En réalité, le problème n'apparait que si on fait appel à une DLL contenant des fiches. Le problème est donc reproductible sous Delphi 6 (vérifié).
J'ai parcouru je ne sais pas combien de contributions sur le net dans l'espoir de trouver une solution mais je n'ai rien trouvé qui fonctionne ou qui me mette sur une piste.
J'ai donc recherché par moi-même et je n'ai rien trouvé non plus.
Je me suis donc rabattu sur la solution de réintégrer les fiches dans mon exécutable dans la mesure où ma DLL ne sera plus partagée avec d'autres applications dans l'avenir.
En clair, je jette l'éponge après deux jours de recherche. L'effort et le temps passé ne seront pas, de toutes façons, récompensés en ce qui me concerne.
Notez que le problème apparait même sous Delphi 2005 et que Borland ne propose toujours pas de solution.
Bon courage à vous.
May Delphi be with you !
<hr color="#008000">
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.