Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1363 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°419014
backdafuck​up
Back to da old skool
Posté le 06-06-2003 à 10:27:42  profilanswer
 

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:

mood
Publicité
Posté le 06-06-2003 à 10:27:42  profilanswer
 

n°419017
chrisbk
-
Posté le 06-06-2003 à 10:29:56  profilanswer
 

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()

n°419022
backdafuck​up
Back to da old skool
Posté le 06-06-2003 à 10:31:55  profilanswer
 

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 ?

n°419027
chrisbk
-
Posté le 06-06-2003 à 10:32:39  profilanswer
 

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 ?

n°419033
backdafuck​up
Back to da old skool
Posté le 06-06-2003 à 10:36:07  profilanswer
 

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

n°419034
chrisbk
-
Posté le 06-06-2003 à 10:36:43  profilanswer
 

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
n°419039
backdafuck​up
Back to da old skool
Posté le 06-06-2003 à 10:39:05  profilanswer
 

chrisbk a écrit :

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


CreateThread ca marche pas ?

n°419063
chrisbk
-
Posté le 06-06-2003 à 11:01:19  profilanswer
 

backdafuckup a écrit :


CreateThread ca marche pas ?


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

n°419070
backdafuck​up
Back to da old skool
Posté le 06-06-2003 à 11:03:12  profilanswer
 

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...))

n°419072
chrisbk
-
Posté le 06-06-2003 à 11:03:57  profilanswer
 

FindWindow

mood
Publicité
Posté le 06-06-2003 à 11:03:57  profilanswer
 

n°419126
backdafuck​up
Back to da old skool
Posté le 06-06-2003 à 11:23:16  profilanswer
 

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
n°419171
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 06-06-2003 à 11:35:49  profilanswer
 

Il faut que tu fasses une dll MFC :o


---------------
J'ai un string dans l'array (Paris Hilton)
n°419178
backdafuck​up
Back to da old skool
Posté le 06-06-2003 à 11:37:18  profilanswer
 

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...

n°419186
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 06-06-2003 à 11:40:06  profilanswer
 

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)
n°419189
backdafuck​up
Back to da old skool
Posté le 06-06-2003 à 11:42:12  profilanswer
 

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 ?

n°419363
Konar
Posté le 06-06-2003 à 13:37:09  profilanswer
 

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.

n°419407
backdafuck​up
Back to da old skool
Posté le 06-06-2003 à 14:13:21  profilanswer
 

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:

n°419467
backdafuck​up
Back to da old skool
Posté le 06-06-2003 à 14:48:12  profilanswer
 

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
n°419571
backdafuck​up
Back to da old skool
Posté le 06-06-2003 à 15:32:25  profilanswer
 

un ptit up...

n°419574
Konar
Posté le 06-06-2003 à 15:34:04  profilanswer
 

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

n°419586
backdafuck​up
Back to da old skool
Posté le 06-06-2003 à 15:39:24  profilanswer
 

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
n°419664
Konar
Posté le 06-06-2003 à 16:05:01  profilanswer
 

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.

n°419704
backdafuck​up
Back to da old skool
Posté le 06-06-2003 à 16:14:49  profilanswer
 

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...

n°419730
Konar
Posté le 06-06-2003 à 16:19:44  profilanswer
 

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.

n°419736
backdafuck​up
Back to da old skool
Posté le 06-06-2003 à 16:21:40  profilanswer
 

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 ?

n°419760
Konar
Posté le 06-06-2003 à 16:25:44  profilanswer
 

backdafuckup a écrit :


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


 
bon dans l'inutilité...

n°419764
backdafuck​up
Back to da old skool
Posté le 06-06-2003 à 16:26:53  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
Récupérer le contenu d'une partie d'une fenetre...cherche script ou application gerant le nombre de visite et l'ip
[VBA + Access] Comment récupérer la version de tous les formulaires?Récupérer la date système et l'enregistrer dans une base de données
Comment récupérer les numéros de tel entrants dans un programme C++ ?[PHP] Récupérer le nom d un fichier à uploader...
[PHP / JAVASCRIPT] Récupérer des variables d'environnement.[VBA - Access] Récupérer une Date à partir d'une Date Time
récupérer des données dans un fichier excel en javascriptrendre une application multi-utilisateurs...
Plus de sujets relatifs à : [C++] Récupérer le Hwnd d'une application lancée par une dll


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR