Delphi et DLL C++ (Erreur de create form )

grosiflex Messages postés 19 Date d'inscription jeudi 4 octobre 2001 Statut Membre Dernière intervention 21 octobre 2004 - 20 oct. 2004 à 23:24
grosiflex Messages postés 19 Date d'inscription jeudi 4 octobre 2001 Statut Membre Dernière intervention 21 octobre 2004 - 21 oct. 2004 à 23:43
Bonjour,

Voila j'ai codé une dll en C++ avc VC++ dans cette DLL il y'a un thread. qui gere une connexion, socket, etc...

A coté j'ai une interface graphique (.exe), développée en Delphi 7. Cet interface utilise la DLL.

A L'init, l'application passe en parametres a la DLL des pointeurs sur ses fonctions. Ainsi Mon thread c++ peut acceder a des focntions delhpi.

JE me sert de ces fonctions comme evenements du style procedure OnConnect(), procedure OnDeconnect();

Tous marche bien jusqu'a ce que j'essaye dans uen de ces focntion (procedure OnMsg() ) de creer une fenetre:
Form1 := TForm.Create( Self );
ou
Form1 := TForm.Create( FrmMain );

ca ce moment la Delphi perd les pedales, c'est a dire que la fenetre j'affiche bien, mais n'est pas "rafreshie" elle est blanchatre et ne repond pas. par contre si un autre evenements est appellé la fenetre principale est bien rafreshie et repond bien, mais la fenetre creer reste en "nouille"

Et quand je coup l'appli j'ai une erreur "Handle de fenetre non valide"

Pour info:
------------
Si je delgue le create a un timer sur la fiche (interval 1) et que mon evenement OnMsg() ne fait que FrmMain.Timer1.Enable := True; ca marche bien mais c'est pas tres propre

Je ne comprend pas pkoi ca me fait ca. j'ai essayé sur plusieurs machine et a chaque fois idem....
quelqu'un a une idée ???
y'a t'il un rapport entre le Create et l'appellant ???
Quelqu'un a une solution ???

Si vous avez compris mon probleme:
Est ce une bonne solution pour gerer des evenements entre une DLL et une appli ???
Comment dois je m'y prendre si non ????

:( cela remet en cause toute mon aplli qui est déja pas mal avancée :( !!!

MERCI de m'aider suis vraiment en misere la trovu erien a ce sujet sur le net, ou alors je cherche mal...

A++
Grosiflex

5 réponses

grosiflex Messages postés 19 Date d'inscription jeudi 4 octobre 2001 Statut Membre Dernière intervention 21 octobre 2004
20 oct. 2004 à 23:54
j'ai oubié de préciser que si la fenetre etait déja creer il y'y avais plus de probleme....
Comment fait pour la creer dynamiquement ???

Comment puis faire lancer le Create pas ma fenetre principale ???
0
cs_leveugle Messages postés 27 Date d'inscription lundi 8 mars 2004 Statut Membre Dernière intervention 18 novembre 2004
21 oct. 2004 à 20:00
Salut,

je pense que cela doit avoir un rapport avec la méthode synchronize de l'objet TThread de Delphi...
jettes un oeil de ce côté....

A+
Damien
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
21 oct. 2004 à 21:09
leveugle a en partie raison je pense. Mais le problème va au delà.
J'ai connu ces poblèmes même avec une DLL écrite en Delphi.

L'application principale (celle écrite en Delphi) possède un objet TApplication créé par défaut. Cet objet possède un handle.

Une DLL ne partage pas l'objet application en question. Cela se comprend dans la mesure où elle peut être appelée par différents process. Mais elle possède malgré tout un objet Application dont le Handle est à zéro par défaut.

Voici ce que je te propose : dans la première fonction appelée pour initialiser la DLL, tu passes le handle de l'application "mère" et tu l'affectes au handle de l'objet TApplication de la DLL.
void InitDll(THandle AppHandle)
{
  Application->Handle = AppHandle;
}
begin


Ainsi, Windows enverra également ses messages à la DLL.

Je te laisse le soin d'adapter ton code à tes besoins, mais le principe est celui-ci.

Avant de libérer la Dll, je te recommande d'affecter 0 au handle de son objet TApplication.
void KillDll()
{
  Application->Handle = 0;
}


Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
grosiflex Messages postés 19 Date d'inscription jeudi 4 octobre 2001 Statut Membre Dernière intervention 21 octobre 2004
21 oct. 2004 à 23:30
Bien déja merci a vous de m'aider, je dirais meme plus:

un GRAND MERCI a VOUS !!!

Les informations enoncées ici vont surement m'aider a pousser la recherche suivant ces pistes.

Le seul probleme, c'est que:

- je n'est pas de TThread dans l'exe delphi
- je ne vois pas comment faire le lient entre une TApplication en delphi et dans ma DLL C++...

je vais pousser la recherche, si vous avez d'autres idées n'hesitez pas....

Je me demandais juste si il n'exitait pas une methode pou faire executer du code au processus princiapale de l'application pluto que par le thread de ma dll ???

je continue a chercher

a bientot
0

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

Posez votre question
grosiflex Messages postés 19 Date d'inscription jeudi 4 octobre 2001 Statut Membre Dernière intervention 21 octobre 2004
21 oct. 2004 à 23:43
Ou si non autre questions:

Comment faire executer (proprement) des evenements a mon exe delphi par ma dll ????

-sans me lancer dans un activeX forcement
-en evitant un minimum les conceptes trop MS

Ou si non comment puis-je passer le Handle de la TApplication a ma DLL et ca veux dire koi en C lol ???

merci

a bientot
0
Rejoignez-nous