FindWindow et SendMessage

Résolu
gbourgeois0019 Messages postés 152 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 2 juin 2008 - 17 juin 2006 à 22:09
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 - 19 juin 2006 à 18:36
Salut

J'ai un premier programme qui a ceci comme code au tout debut du WinMain :

HWND hWnd = FindWindow(0,"MonProgramme");
    if ( hWnd != NULL )
    {
        char* Line = new char[MAX_PATH];
        strcpy(Line,GetCommandLine());
        ::SendMessage(hWnd,COMMANDLINE,(WPARAM)Line,0);
        return 1;
    }

Et dans ce meme programme jai dans la procedure de fenetre un case COMMANDLINE avec le code suivant :

Path = new char[MAX_PATH];
strcpy(Path,(const char*)wParam);
...

Tout cela dans le but de ne pouvoir avoir qu'une seule instance du programme qui roule tout en envoyant la ligne de commande au premier si on tente d'en ouvrir un autre ...

Cependant, apres avoir fait strcpy(Path,(const char *)wParam); il n'y a que quelques carcatères dans Path, rien a voir avec la commandline .

Est-ce que quelqu'un saurait qu'est-ce qui ne va pas ??

27 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 juin 2006 à 23:09
WM_COPYDATA est fait pour cela.

ciao...
BruNews, MVP VC++
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
17 juin 2006 à 23:53
Il faut mettre cpdtData.cbData = MAX_PATH, car c'est la taille réelle des données que tu veux envoyer
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
17 juin 2006 à 22:56
Il y a deux processus effectifs (celui qui envoie et celui qui recoit). Il n'ont pas le même espace d'adressage, le second ne peut donc pas lire ce que le premier a alloué
Je pense qu'avec ReadProcessMemory tu devrais pouvoir t'en sortir
Dans tous les cas, tu dois trouver une solution qui permettent aux deux processus d'accéder au même espace mémoire
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
17 juin 2006 à 23:25
Ouah super ce truc, je connaissais pas
0

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

Posez votre question
gbourgeois0019 Messages postés 152 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 2 juin 2008 1
17 juin 2006 à 23:45
Donc si je comprend bien ....

Pour envoyer :

COPYDATASTRUCT cpdtData;
    HWND hWnd = FindWindow(0,"PlayIt by Guillaume Bourgeois");
if ( hWnd != NULL )
    {
        char* Line = new char[MAX_PATH];
        strcpy(Line,GetCommandLine());
        cpdtData.cbData = sizeof(Line);
        cpdtData.lpData = Line;
        cpdtData.dwData = 0;
        ::SendMessage(hWnd,WM_COPYDATA,(WPARAM)hInstance,(LPARAM)&cpdtData);
        return 1;
    }

Mais la pour recevoir jai des problèmes, et en plus je ne suis pas sur que je dois encoyer comme je le fait !! si tu pouvais m'eclairer un peu ce serait super :)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 juin 2006 à 23:47
sizeof(Line) = 4

ciao...
BruNews, MVP VC++
0
gbourgeois0019 Messages postés 152 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 2 juin 2008 1
17 juin 2006 à 23:48
Ouais sa je suis d'accord mais sa m'avance pas beaucoup :P
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
17 juin 2006 à 23:52
Au fait je comprends pas comment ca marche: quelle différence avec un autre message qui fait qu'on peut lire la mémoire?
Je pensais que que SendMessage envoyait sans réfléchir a la WndProc de la fenêtre...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 juin 2006 à 23:58
WM_COPYDATA marche comme WM_SETTEXT quand cible n'appartient pas au processus sendeur, c'est le system qui trouve une zone mémoire libre dans la cible et y copie les données, fort heureusement l'API est assez bien pensée.

ciao...
BruNews, MVP VC++
0
gbourgeois0019 Messages postés 152 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 2 juin 2008 1
18 juin 2006 à 00:11
Ahhhh... enfin ca marche :)  Merci beaucoup BruNews et vecchio56 !! Je sais pas ce que je ferais si vous etiez pas la ;)
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
18 juin 2006 à 09:38
je vai peut être passer pour un imbécile, mais :

char* Line = new char[MAX_PATH];

new char[MAX_PATH] c'est du C ça??? c'est l'opérateur new qui me choque mdr.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 juin 2006 à 10:17
API est utilisable avec d'autres langages que C, en fait par tous ceux pouvant utiliser la convention d'appel stdcall.

ciao...
BruNews, MVP VC++
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
18 juin 2006 à 10:20
Merci BruNews, je ne savai pas que new en était une lol.
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
18 juin 2006 à 10:25
new c'est du C++
Mais il voulait juste dire que les API pouvaient être utilisées avec n'importe quel langage supportant la convention __stdcall...

ULARGE_INTEGERJokyQi=QI("Joky"
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
18 juin 2006 à 10:26
Pourquoi j'ai répété bêtement ce qu'a dit BruNews Intelligemment ? :)
ULARGE_INTEGERJokyQi=QI("Joky"
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
18 juin 2006 à 10:29
oui daccord mais les chaine de caractère en C++ c'est pas String ??? je n'en ai fait que très peut faut dire lol
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
18 juin 2006 à 10:33
Bé avec le C++ on peut utiliser le C...
Y'a juste des outils en plus...

ULARGE_INTEGERJokyQi=QI("Joky"
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
18 juin 2006 à 10:40
Ouai ... mais je suis pas convincu quand au malange de deux langage aussi proche soit-il, soit on fait du C soit du C++.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
18 juin 2006 à 11:10
Moi je ne vois aucun mélange, tu délires un petit peu. Les API ne sont pas plus réservées au C qu'au C++
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
18 juin 2006 à 11:52
Je ne parle pas des API

char* Line = new char[MAX_PATH]; pas de mélange, char * C et String C++.
0
Rejoignez-nous