Récupérer le Hwnd d'une application lancée par une dll [C++] - C++ - Programmation
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()
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 ?
Marsh Posté le 06-06-2003 à 10:32:39
backdafuckup a écrit : |
tu peux pas dans ta dll faire un thread qui lui lance ton programme et se bloque jusqu'a fin dudit programme ?
Marsh Posté le 06-06-2003 à 10:36:07
chrisbk a écrit : |
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
Marsh Posté le 06-06-2003 à 10:36:43
AfxBeginThread()
rien de plus con, c franchement pas plus de deux lignes / une fonction
Marsh Posté le 06-06-2003 à 10:39:05
chrisbk a écrit : AfxBeginThread() |
CreateThread ca marche pas ?
Marsh Posté le 06-06-2003 à 11:01:19
backdafuckup a écrit : |
Chaipas, j'utilise tjs AfxBeginThread()
http://msdn.microsoft.com/library/ [...] thread.asp
Marsh Posté le 06-06-2003 à 11:03:12
backdafuckup a écrit : |
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 :
|
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...))
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 ??)
Marsh Posté le 06-06-2003 à 11:35:49
Il faut que tu fasses une dll MFC
Marsh Posté le 06-06-2003 à 11:37:18
Harkonnen a écrit : Il faut que tu fasses une dll MFC |
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...
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
Marsh Posté le 06-06-2003 à 11:42:12
Harkonnen a écrit : Euh, par contre, quelques petites précisions au sujet des threads : |
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 ?
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.
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
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 :
|
J'ai essayé la chose suivante :
Code :
|
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 :
|
un handle n'est il pas de type HWND__ * normalement ???
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).
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..
Marsh Posté le 06-06-2003 à 16:05:01
backdafuckup a écrit : zut... |
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.
Marsh Posté le 06-06-2003 à 16:14:49
Bon...
Maintenant j'ai un autre problème (merci à Konar pour ton aide )
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...
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.
Marsh Posté le 06-06-2003 à 16:21:40
Konar a écrit : user32.lib ou kerner32.lib |
je vais voir...
pragma, déjà vu, mais jamais utilisé...
Il était bon, tu trouves ?
Marsh Posté le 06-06-2003 à 16:25:44
backdafuckup a écrit : |
bon dans l'inutilité...
Marsh Posté le 06-06-2003 à 16:26:53
Konar a écrit : |
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)...
Merci à tout le monde
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 :
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...