FindWindow et SendMessage [Résolu]

Signaler
Messages postés
152
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
2 juin 2008
-
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
-
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

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
WM_COPYDATA est fait pour cela.

ciao...
BruNews, MVP VC++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Il faut mettre cpdtData.cbData = MAX_PATH, car c'est la taille réelle des données que tu veux envoyer
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Ouah super ce truc, je connaissais pas
Messages postés
152
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
2 juin 2008
1
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 :)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
sizeof(Line) = 4

ciao...
BruNews, MVP VC++
Messages postés
152
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
2 juin 2008
1
Ouais sa je suis d'accord mais sa m'avance pas beaucoup :P
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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...
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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++
Messages postés
152
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
2 juin 2008
1
Ahhhh... enfin ca marche :)  Merci beaucoup BruNews et vecchio56 !! Je sais pas ce que je ferais si vous etiez pas la ;)
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
1
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.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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++
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
1
Merci BruNews, je ne savai pas que new en était une lol.
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
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"
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Pourquoi j'ai répété bêtement ce qu'a dit BruNews Intelligemment ? :)
ULARGE_INTEGERJokyQi=QI("Joky"
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
1
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
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Bé avec le C++ on peut utiliser le C...
Y'a juste des outils en plus...

ULARGE_INTEGERJokyQi=QI("Joky"
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
1
Ouai ... mais je suis pas convincu quand au malange de deux langage aussi proche soit-il, soit on fait du C soit du C++.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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++
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
1
Je ne parle pas des API

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