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
> - Méthode d'ATL (à mon avis la meilleure, mais ca fait appel à pas mal de
magie noir / assembleur) : un thunk. Grosso-modo, on sous-classe la


fenêtre
(SetWindowLong(GWLP_WNDPROC)) en passant comme nouvelle WndProc une petite
fonction créée dyanmiquement en assembleur (le thunk), qui modifie la pile
d'appel en remplacant le paramètre HWND par le pointeur de l'instance
correspondante. Dans ATL, le principe est encore complexifié par le fait


que
CWindowImpl est une classe lourdement template, mais ca vaut le coup


d'oeil!
Voir les classes CWindowImpl et CWndProcThunk pour avoir une idée de la
bête.



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.
Avatar
Thierry
Bonjour,

Aurélien REGAT-BARREL a écrit :

Ils allouent un buffer exécutable, y placent les opcodes assembleurs
qu'il faut en modifiant l'adresse de l'appel. Cette routine compilée
dynamiquement est donnée comme nouvelle callback de la fenêtre crée
via un subclassing SetWindowLong( GWL_WNDPROC, CallMyInstanceXXX );
C'est osé hein ?



A quel moment il est fait le subclassing ?

--
« Always look at the bright side of the life... »
Avatar
AMcD®
Vincent Burel wrote:

C'est pas ce que je voulais dire,



c'est jamais ce que tu voulais dire :-)



Lol, comme au bon vieux temps :'o).

. Je raisonnais en terme de posts.
C'est pas la marée haute...





ha ! oui... il faut dire qu'un peu tous les sujets on déjà été
abordés et que sur les archives de ce newsgroup (via google), on
trouve a peu près toujours une réponse à la question qu'on se pose.
il faut le dire : beaucoup grace à l'encyclopédie ASTOR :-)



Comment t'as pas encore compris ? Il existe pas C.Astor, c'est un robot !
T'as qu'à lire ses réponses... Bon là, ils ont embauché un stagiaire de
deuxième année d'IUT pour y greffer un chtit module d'IA et on obtient
parfois quelques phrases de français, mais, ça ne trompe personne.

Maintenant, ben il faut inventer des problèmes pour créer de la
discussion... :-)



Ou alors ils sont tous en train de passer à .NET...

--
AMcD®

http://arnold.mcdonald.free.fr/

VB


Avatar
Aurélien REGAT-BARREL
Ben via un appel à SetWindowLong.
A moins que je ne me trompe, changer la wndproc c'est du subclassing.
Avatar
Thierry
Bonjour,

Aurélien REGAT-BARREL a écrit :

Ben via un appel à SetWindowLong.
A moins que je ne me trompe, changer la wndproc c'est du subclassing.



Yep, mais pour faire le Subclassing faut un handle.
Ce Subclassing est fait juste apres le CreateWindow ou lors de la reception
du WM_CREATE ?


--
« Always look at the bright side of the life... »
Avatar
Ambassadeur Kosh
> Ou alors ils sont tous en train de passer à .NET...



possible, et trés probable :o)
Avatar
Aurélien REGAT-BARREL
> Yep, mais pour faire le Subclassing faut un handle.
Ce Subclassing est fait juste apres le CreateWindow ou lors de la


reception
du WM_CREATE ?



De mémoire, après le CreateWindow.
Avatar
Vincent Burel
"Aurélien REGAT-BARREL" wrote in message
news:408683bb$0$17626$
> Yep, mais pour faire le Subclassing faut un handle.
> Ce Subclassing est fait juste apres le CreateWindow ou lors de la
reception
> du WM_CREATE ?

De mémoire, après le CreateWindow.



1- SetClassLong si vous voulez subclasser une classe entière c'est plus
simple.
2- pour info le premier message que reçois une callback window est
WM_NCCREATE je crois.

VB
Avatar
Vincent Burel
"AMcD®" wrote in message
news:40866866$0$27025$
Vincent Burel wrote:

> ha ! oui... il faut dire qu'un peu tous les sujets on déjà été
> abordés et que sur les archives de ce newsgroup (via google), on
> trouve a peu près toujours une réponse à la question qu'on se pose.
> il faut le dire : beaucoup grace à l'encyclopédie ASTOR :-)

Comment t'as pas encore compris ? Il existe pas C.Astor, c'est un robot !
T'as qu'à lire ses réponses... Bon là, ils ont embauché un stagiaire de
deuxième année d'IUT pour y greffer un chtit module d'IA et on obtient
parfois quelques phrases de français, mais, ça ne trompe personne.



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...

n'importe quoi ! :-)) bon puisque tout le monde se mets au .NET... je sais
pas trop ce que je vais faire... vais voir du côté de chez apple tient...
:-)

a+
VB
Avatar
AMcD®
Vincent Burel wrote:

n'importe quoi ! :-)) bon puisque tout le monde se mets au .NET... je
sais pas trop ce que je vais faire... vais voir du côté de chez apple
tient... :-)



Ha non, pas encore tout le monde ! Je doute d'ailleurs de m'y mettre un
jour.

J'accroche pas, mais alors, pas du tout !

--
AMcD®

http://arnold.mcdonald.free.fr/