OVH Cloud OVH Cloud

acces memoire directe sous windows avec C++

79 réponses
Avatar
heinquoi
Bjr,

Ayant un probleme avec une fonction de CALLBACK et pour ne pas la citer
WndProc, j'ai chercher à acceder directement à la memoire, sans y parvenir
( sous dos nous avons la fameuse peekb ) mais sous win32 je n'y parvient
pas.
_comment acceder directement a la memoire virtuelle alloué au processus de
mon prog ?
_Et/ou acceder directement à la memoire virtuelle general ? ( genre dump)

et eventuellement, si un puriste avait trouvé la solution pour faire du vrai
C++ avec <Windows.h> et notament placer WndProc dans une classe. En tirer
son adresse sur un pointeur type WNDPROC, la ce serais vraiment NOEL pour
moi. ( j'ai le sentiment que les fonctions appartenant à un classe ne sont
pas constitué de la meme facon que les fonctions C: pointeur "this" peut
etre ?)

Ce probleme est récurant lorsque l'on se lance dans la programmation
windows.
DirectX par exemple ou APIWindows ne sont pas adapté au C++ a cause notament
de ces callback.
Votre avis ?
Cordialement
Heinquoi

10 réponses

Avatar
Aurélien REGAT-BARREL
"Vincent Burel" a écrit dans le message de
news:c662l6$681$
1- SetClassLong si vous voulez subclasser une classe entière c'est plus
simple.



Justement on ne veut pas subclasser toute une classe, mais uniquement cette
fenêtre.
Chaque fenêtre se voit associer sa propre WndProc créée dynamiquement.
Cette WndProc "dynamique" appelle la WndProc de la classe en lui passant
l'instance C++ associée à cette HWND (c'est clair non ? :-)
Avatar
Aurélien REGAT-BARREL
> c'est vrai qu'il a un nom d'ordinateur des années 80 ... Je crois qu'on


lui
a proposé un role dans 2010 pour remplacer HAL 9000 . Le ASTOR 2001 n'a


pas
de sentiments contradictoire comme le HAL 9000 donc moins dangereux pour
l'équipage... mais ca coutait trop cher...



Puisque ça troll, petite annecdote sur ce nom "HAL".
const char * hal = "HAL";
int i = 0;
while ( hal[ i ] != '' )
{
char c = hal[ i ] + 1;
printf( "%c", c );
++i;
}
Avatar
Vincent Burel
"Aurélien REGAT-BARREL" wrote in message
news:40869da6$0$17625$
"Vincent Burel" a écrit dans le message de
news:c662l6$681$
> 1- SetClassLong si vous voulez subclasser une classe entière c'est plus
> simple.

Justement on ne veut pas subclasser toute une classe, mais uniquement


cette
fenêtre.
Chaque fenêtre se voit associer sa propre WndProc créée dynamiquement.
Cette WndProc "dynamique" appelle la WndProc de la classe en lui passant
l'instance C++ associée à cette HWND (c'est clair non ? :-)



d'accord c'est clair... mais je ne vois pas l'utilité du côté "dynamique" de
la chose.
une seule wndproc de sousclassement suffit, d'utilisez le champ GWL_USERDATA
de la windows pour y stocker l'instance de l'objet associé.

si la windows est définie par une de vos classe , propriétaire , faite en
sorte que le champ cbWndExtra ne soit pas zero sinon vous ne pourrez rien
stocker dans vos fenêtres...

VB
Avatar
Vincent Burel
"Aurélien REGAT-BARREL" wrote in message
news:40869ea9$0$17602$
> c'est vrai qu'il a un nom d'ordinateur des années 80 ... Je crois qu'on
lui
> a proposé un role dans 2010 pour remplacer HAL 9000 . Le ASTOR 2001 n'a
pas
> de sentiments contradictoire comme le HAL 9000 donc moins dangereux pour
> l'équipage... mais ca coutait trop cher...

Puisque ça troll, petite annecdote sur ce nom "HAL".
const char * hal = "HAL";
int i = 0;
while ( hal[ i ] != '' )
{
char c = hal[ i ] + 1;
printf( "%c", c );
++i;
}



A l'époque il se disait que c'était comme ca qu'ils avaient trouvé le nom de
l'ordinateur de 2001.

VB
Avatar
AMcD®
Aurélien REGAT-BARREL wrote:

Puisque ça troll, petite annecdote sur ce nom "HAL".
const char * hal = "HAL";
int i = 0;
while ( hal[ i ] != '' )
{
char c = hal[ i ] + 1;
printf( "%c", c );
++i;
}



Puisque ça trolle, optimise un peu :o) :

const char * hal = "HAL";
int i = 0;
while ( hal[i]!= '' ) printf( "%c", hal[i++] + 1 );

--
AMcD®

http://arnold.mcdonald.free.fr/
Avatar
Ambassadeur Kosh
> Puisque ça trolle, optimise un peu :o) :

const char * hal = "HAL";
int i = 0;
while ( hal[i]!= '' ) printf( "%c", hal[i++] + 1 );



je propose un peu plus rapide :

printf("IBM") ;

quoi, je suis lourd ? naaannnn....
Avatar
Cyrille Szymanski
On 2004-04-21, Ambassadeur Kosh wrote:
Puisque ça trolle, optimise un peu :o) :

const char * hal = "HAL";
int i = 0;
while ( hal[i]!= '' ) printf( "%c", hal[i++] + 1 );



je propose un peu plus rapide :

printf("IBM") ;



AAAAAAhhh

printf() pour afficher une chaîne constante ???
Quelle optimisation !

--
cns
Avatar
Cyrille Szymanski
On 2004-04-21, AMcD® wrote:
Aurélien REGAT-BARREL wrote:

Puisque ça troll, petite annecdote sur ce nom "HAL".
const char * hal = "HAL";
int i = 0;
while ( hal[ i ] != '' )
{
char c = hal[ i ] + 1;
printf( "%c", c );
++i;
}



Puisque ça trolle, optimise un peu :o) :

const char * hal = "HAL";
int i = 0;
while ( hal[i]!= '' ) printf( "%c", hal[i++] + 1 );



AAAAAAh

printf() pour fficher un caractère ????

--
cns
Avatar
AMcD®
Cyrille Szymanski wrote:

AAAAAAh

printf() pour fficher un caractère ????



Bah quoi ? Tu veux putchar() ?

--
AMcD®

http://arnold.mcdonald.free.fr/
Avatar
Arnaud Debaene
Aurélien REGAT-BARREL wrote:

Arf, je savais pas qu'ATL l'utilisait. C'est sorti quand ATL, avant
ou après OWL ? Car je suis presque sûr d'avoir vu cette technique
dans OWL, ce qui n'en donnerait pas la paternité à MS.



ATL 1.0 date de l'été 96. Ce principe s'appelle le thunking, et ce n'est ni
ATL ni OWL qui l'ont inventé, c'est une méthode qui a été beaucoup utilisée
dans les années 70-80 quand le jeu préféré des informaticiens était la
génération dynamique de code.
Depuis, les OS et le hard ont rendu la chose un peu plus compliqué
(protection des zones de code/data, cache des instructions, etc....), et on
s'est surtout rendu compte qu'abuser de ce genre de choses était un
cauchemar de maintenance, mais bien utilisé c'est très puissant.

Quand à savoir qui a eu l'idée de le faire en 1er pour les WndProc, aucune
idée, il faudrait demander à un vieux routier de Win 3.1 (voir avant).

Arnaud