gbourgeois0019
Messages postés152Date d'inscriptionlundi 3 avril 2006StatutMembreDernière intervention 2 juin 2008
-
17 juin 2006 à 22:09
deck_bsd
Messages postés1243Date d'inscriptionjeudi 31 mars 2005StatutMembreDerniè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 ??
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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
gbourgeois0019
Messages postés152Date d'inscriptionlundi 3 avril 2006StatutMembreDernière intervention 2 juin 20081 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 :)
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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.