[C++] Récupérer le Hwnd d'une application lancée par une dll

Récupérer le Hwnd d'une application lancée par une dll [C++] - C++ - Programmation

Marsh Posté le 06-06-2003 à 10:27:42    

Bonjour,
 
Une dll faite sous Visual C++ 6 (windows 2k), lorsqu'elle est compilée, est envoyée dans le répertoire suivant : "C:\Program Files\Gatan\DigitalMicrograph\PlugIns"
Le compilateur lance l'execution du fichier "C:\Program Files\Gatan\DigitalMicrograph\DigitalMicrograph.exe"
 
Cette dll ajoute une option de menu au menu général de l'application.
 
Dans ce menu, il y a une option paramétrage. Lorsqu'on clique dessus, la dll appelle un programme MFC "E:\GRISTI\PremiereAppli\Debug\PremiereAppli.exe"
 
Dans Digital Micrograph, il y a une fenetre, nomée Result qui permet l'affichage de phrases, pour informer l'utilisateur d'actions ou d'évènements par exemple.
 
Je souhaiterais, quand je ferme le programme PremiereAppli.exe, qu'un message soit envoyé à DigitalMicrograph, afin qu'il affiche dans Result un truc du style "Fermeture de l'application de paramétrage"...
 
Pour ecrire un message dans la fenetre Result, on fait, dans le code de la DLL :  
 

Code :
  1. DM::Result("Phrase que l'on veut écrire\n" );


 
Mieux :  
 
L'application PremiereAppli.exe est sensée etre déjà lancée, en tache de fond (elle est dans la zone system tray).
J'aimerais que DigitalMicrograph (ou plutot ma dll) envoie un message à cette application pour appeler une DialogBox de l'application en question, et non la premiere dialogbox...
 
Est-ce que la fonction PostMessage peut servir pour envoyer un message à une autre application ?
Ou alors je fais fausse route, et à ce moment la, vous avez une idée... :jap:

Reply

Marsh Posté le 06-06-2003 à 10:27:42   

Reply

Marsh Posté le 06-06-2003 à 10:29:56    

a mon avis tu fais fausse route, le mieux etant de faire en sorte que ta DLL sache quand ton prog se termine et fasse elle meme le DM::result()

Reply

Marsh Posté le 06-06-2003 à 10:31:55    

chrisbk a écrit :

a mon avis tu fais fausse route, le mieux etant de faire en sorte que ta DLL sache quand ton prog se termine et fasse elle meme le DM::result()


Ben c'est justement ce que je cherche à faire...
 
Je cherche comment prévenir ma dll que le prog se termine...
Il faut que je rajoute un PostMessage dans le OnClose de ce prog ? Ou alors la dll peut le détecter avec d'autres fonctions ?

Reply

Marsh Posté le 06-06-2003 à 10:32:39    

backdafuckup a écrit :


Ben c'est justement ce que je cherche à faire...
 
Je cherche comment prévenir ma dll que le prog se termine...
Il faut que je rajoute un PostMessage dans le OnClose de ce prog ? Ou alors la dll peut le détecter avec d'autres fonctions ?
 


 
tu peux pas dans ta dll faire un thread qui lui lance ton programme et se bloque jusqu'a fin dudit programme ?

Reply

Marsh Posté le 06-06-2003 à 10:36:07    

chrisbk a écrit :


 
tu peux pas dans ta dll faire un thread qui lui lance ton programme et se bloque jusqu'a fin dudit programme ?


Le seul problème est que le projet est à terminer le 18/06, et que je n'ai jamais fait de thread avec C++. A moins que ca soit très simple (Je pense que la classe CThread doit pas etre compliquée à utiliser, mais le temps me manque), je n'aurais pas le temps d'apprendre et de mettre en place des threads...
 
Enfin, je vais quand meme regarder dans cette direction.. Vive la msdn !!
 
merci chris...
 
Si vous avez d'autres idées, n'hésitez pas

Reply

Marsh Posté le 06-06-2003 à 10:36:43    

AfxBeginThread()
 
rien de plus con, c franchement pas plus de deux lignes / une fonction


Message édité par chrisbk le 06-06-2003 à 10:36:56
Reply

Marsh Posté le 06-06-2003 à 10:39:05    

chrisbk a écrit :

AfxBeginThread()
 
rien de plus con, c franchement pas plus de deux lignes / une fonction


CreateThread ca marche pas ?

Reply

Marsh Posté le 06-06-2003 à 11:01:19    

backdafuckup a écrit :


CreateThread ca marche pas ?


 
Chaipas, j'utilise tjs AfxBeginThread() [:spamafote]
 
http://msdn.microsoft.com/library/ [...] thread.asp

Reply

Marsh Posté le 06-06-2003 à 11:03:12    

backdafuckup a écrit :


CreateThread ca marche pas ?


Bon, je commence à comprendre la classe CWinThread.
T'avais raison, c'est pas bien compliqué.
 
Par contre, j'ai une autre question, à laquelle tout le monde est invité à répondre.
 
Je crée une fonction qui va etre éxecutée par mon thread
déclarée ainsi :

Code :
  1. UINT FonctionThread (LPVOID pParam);


 
Cette fonction aura pour but de lancer le programme "E:\GRISTI\PremiereAppli\Debug\PremiereAppli.exe"
 
Je lance ce programme avec la fonction ShellExecute.
Est il possible de récupérer un handle de la fenetre de ce programme ?
Si oui comment ?
Parce que pour récupérer un handle, je connaissais GetSafeHwnd(), mais la je suis perdu, et je m'embrouille dans la msdn (j'ai que la msdn on line (sur le site kwa...))

Reply

Marsh Posté le 06-06-2003 à 11:03:57    

FindWindow

Reply

Marsh Posté le 06-06-2003 à 11:03:57   

Reply

Marsh Posté le 06-06-2003 à 11:23:16    

J'ai un ptit problème...
 
Apparement, depuis ma dll, j'ai pas accès aux classes MFC (comme CWinThread, CString, CWnd, etc)
 
J'ai pourtant mis dans Project->Settings->Using MFC as a shared DLL...
 
Idées pendant que je cherche de mon coté ?
 
Il n'y a pas un fichier à inclure pour avoir accès à ces classes ? (windows.h stdafx.h ??)


Message édité par backdafuckup le 06-06-2003 à 11:30:50
Reply

Marsh Posté le 06-06-2003 à 11:35:49    

Il faut que tu fasses une dll MFC :o


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 06-06-2003 à 11:37:18    

Harkonnen a écrit :

Il faut que tu fasses une dll MFC :o


:o
 
Ben, dans les settings, ya using MFC !
 
Et puis, comme je te l'ai déjà dit, ce n'est pas moi qui ait concu cette dll, la base en tout cas. Moi je ne suis sensé que l'améliorer.
J'aimerais utiliser les MFC, c'est tout. Et sans refaire de projet, vu que je ne peux pas...

Reply

Marsh Posté le 06-06-2003 à 11:40:06    

Euh, par contre, quelques petites précisions au sujet des threads :
OK, c'est simple à démarrer et à éteindre. Seulement les threads c'est aussi la synchronisation, et ça c'est beaucoup moins évident.
J'espère que tu n'utilises pas de variables globales, sinon tu files droit vers le deadlock ou la race condition si tu ne lockes pas ces variables, et ça c'est le genre de bug vraiment chiant à détecter


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 06-06-2003 à 11:42:12    

Harkonnen a écrit :

Euh, par contre, quelques petites précisions au sujet des threads :
OK, c'est simple à démarrer et à éteindre. Seulement les threads c'est aussi la synchronisation, et ça c'est beaucoup moins évident.
J'espère que tu n'utilises pas de variables globales, sinon tu files droit vers le deadlock ou la race condition si tu ne lockes pas ces variables, et ça c'est le genre de bug vraiment chiant à détecter


Et bien si, dans mon projet il y a des fonctions globales et variables globales.
C'est pour ca que j'ai dit que le mec qui a programmé cette dll l'a fait comme un porc... Et moi je dois récupérer tout ca...
 
Bref, je voudrais faire un thread qui lance un programme, afin de se mettre en attente jusqu'à ce que ce programme se termine (pour pouvoir afficher un message : application terminée)
Ya autre chose que CWinThread pour les threads ?

Reply

Marsh Posté le 06-06-2003 à 13:37:09    

Pour avoir un controle plus précis sur le prog lancé, faut eviter le ShellExecute, pense au CreateProcess, qui te renvoie (entre autres) le handle du process créé, que tu peux ensuite tester avec WaitForSingleObject pour savoir s'il est toujours en vie.

Reply

Marsh Posté le 06-06-2003 à 14:13:21    

Konar a écrit :

Pour avoir un controle plus précis sur le prog lancé, faut eviter le ShellExecute, pense au CreateProcess, qui te renvoie (entre autres) le handle du process créé, que tu peux ensuite tester avec WaitForSingleObject pour savoir s'il est toujours en vie.


Ce sont des classes MFC ?
Parce que je ne trouve pas la solution pour acceder aux MFC pour l'instant.  
Je ne peux utiliser aucune classe MFC :cry:

Reply

Marsh Posté le 06-06-2003 à 14:48:12    

Bon alors j'ai fait ca, qui à l'air de marcher (en tout cas ca lance bien le programme...)
 

Code :
  1. CreateProcess("E:\\GRISTI\\PremiereAppli\\Debug\\PremiereAppli.exe", //nom de l'application à lancer
  2.       NULL, //Ligne de commande : NULL ici
  3.       NULL, //SECURITY_ATTRIBUTES du process
  4.       NULL, //SECURITY_ATTRIBUTES du thread
  5.       TRUE, //héritage du handle
  6.       NORMAL_PRIORITY_CLASS, //priorité du processus et de ses threads éventuels
  7.       NULL, //Utiliser les informations de démarrage du parent : ici NON
  8.       NULL, //Utiliser les informations du parent : ici NON
  9.       &si,  //structure STARTUPINFO récupérée
  10.       &pi);  //structure PROCESS_INFORMATION récupérée


 
 
J'ai essayé la chose suivante :  

Code :
  1. PostMessage(pi.hProcess,SW_HIDE,0,0);

 
 
Et ca ne marche pas...
 
Le problème ne vient pas du message évidemment.
Le type de pi.hProcess n'est pas HWND__ *, mais void *...
J'ai essayé un cast bourrin (HWND__*)pi.hProcess, mais ca me fait une grosse erreur de link...
 
Théoriquement (msdn), la structure de pi, de type PROCESS_INFORMATION, est la suivante :  
 

Code :
  1. typedef struct _PROCESS_INFORMATION { 
  2. HANDLE hProcess; 
  3. HANDLE hThread; 
  4. DWORD dwProcessId; 
  5. DWORD dwThreadId;
  6. } PROCESS_INFORMATION;


 
un handle n'est il pas de type HWND__ * normalement ???


Message édité par backdafuckup le 06-06-2003 à 15:32:03
Reply

Marsh Posté le 06-06-2003 à 15:32:25    

un ptit up...

Reply

Marsh Posté le 06-06-2003 à 15:34:04    

raté : le hProcess n'est pas un handle de fenetre (HWND), mais le handle du process (HANDLE).

Reply

Marsh Posté le 06-06-2003 à 15:39:24    

zut...
Alors je fais comment moi pour récupérer ce fichu handle sur la fenetre appelée par le process ?
 
 
Et le handle sur le thread ne peut pas servir non plus, je suppose ?
 
Parce que la franchement, je galère...
 
Bon, enfin, je vais passer à autre chose pour l'instant...
Mais continuez à émettre vos idées, et sauvez moi de cette horreur !! Merci.. :jap:


Message édité par backdafuckup le 06-06-2003 à 15:44:42
Reply

Marsh Posté le 06-06-2003 à 16:05:01    

backdafuckup a écrit :

zut...
Alors je fais comment moi pour récupérer ce fichu handle sur la fenetre appelée par le process ?
 
Et le handle sur le thread ne peut pas servir non plus, je suppose ?


 
ca va te servir a koi le HWND ?
paske pour ton but d'origine (savoir qd ton éxé se termine), t'as besoin ke du hProcess, ke tu testes avec WaitForSingleObject.
 
apres si tu veux avoir le HWND, reste le FindWindow() ki marche nickel.

Reply

Marsh Posté le 06-06-2003 à 16:14:49    

Bon...
 
Maintenant j'ai un autre problème (merci à Konar pour ton aide :jap: )
 
J'ai une erreur de link sur les deux fonctions PostMessage et FindWindow...
 
unresolved external symbol... évidemment
 
Il faut quoi comme include pour ces fonctions ?
 
J'ai essayé windows.h, stdafx.h mais rien ne marche...

Reply

Marsh Posté le 06-06-2003 à 16:19:44    

user32.lib ou kerner32.lib
avec un pragma, ou ds les project settings
 
mais le gars qu'est passé avant toi était bon, a mettre "ignore all default libraries" a YES ds les projects settings.

Reply

Marsh Posté le 06-06-2003 à 16:21:40    

Konar a écrit :

user32.lib ou kerner32.lib
avec un pragma, ou ds les project settings
 
mais le gars qu'est passé avant toi était bon, a mettre "ignore all default libraries" a YES ds les projects settings.


 
je vais voir...
pragma, déjà vu, mais jamais utilisé...
Il était bon, tu trouves ?

Reply

Marsh Posté le 06-06-2003 à 16:25:44    

backdafuckup a écrit :


 
je vais voir...
pragma, déjà vu, mais jamais utilisé...
Il était bon, tu trouves ?


 
bon dans l'inutilité...

Reply

Marsh Posté le 06-06-2003 à 16:26:53    

Konar a écrit :


 
bon dans l'inutilité...


non, c'était pas coché en fait. Je les ai rajoutées à la main. Et maintenant ca marche.
Bon après, c'est un problème de messages. Mais bon, au moins, ca c'est fait.
 
Je te remercie...
Maintenant je peux continuer (mais je vais faire un pause par contre)...
 
:jap: Merci à tout le monde

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed