C++ et windows : c'est pas ca

Le
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
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fabien LE LEZ
Le #719156
On Fri, 16 Apr 2004 17:25:44 +0200, "heinquoi"

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.


Exact, ce n'est pas possible directement. Cf
fr.comp.os.ms-windows.programmation pour plus de détails.

et eventuellement, si un puriste avait trouvé la solution pour faire du vrai
C++ avec

Il suffit d'encapsuler le bazar dans une hiérarchie de classes.
Beaucoup l'ont fait : Borland avec sa OWL (puis sa VCL), Microsoft
avec ses MFC (je ne sais pas bien ce que ça donne maintenant), et
d'autres : regarde notamment du côté de wxWidgets (anciennement
wxWindows), libre, gratuit et portable.

--
;-)
FLL, Epagneul Breton

Loïc Joly
Le #718885
heinquoi wrote:

et eventuellement, si un puriste avait trouvé la solution pour faire du vrai
C++ avec 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 ?)


Effectivement, pointeur sur fonction et pointeur sur fonction membre
sont différents.

Pour résoudre ton problème, il y a quand même une solution, à condition
que la fonction permettant de placer le callback soit un minimum bien
foutue...

Si on a :

typedef void (*CallBack) (void* extraParam);
void setCallBack (CallBack cb, void *extraParam);
class A
{
void f(void *extraParam);
};

On peut alors écrire un truc du genre :

struct CallbackWraper
{
typedef void A::(*ClassCallBack) (void *extraParam)
CallbackWraper(A &a, ClassCallBack cb, void* param);
A &a;
void *param;
ClassCallBack cb;
};

void callCallback(void *extraParam)
{
CallbackWraper *cbw = static_cast<cbw*>(extraParam);
cbw->a.*(cbw->cb)(cbw->param)
}

int main()
{
A instance;
int i = 42;
CallBackWraper cbw(instance, &A::f, &i);
setCallBack(callCallback, static_cast<void*>(cbw));
}

--
Loïc

kanze
Le #718287
"heinquoi" news:
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 ?


Avec un pointeur. Pour un type d'objet donné, il faut normalement
convertir son adresse en void*, puis convertir le void* en char* ou
unsigned char* (les types qui permet l'accès à la mémoire brute), au
moyen des static_cast chaque fois. En général, une conversion directe
vers char* ou unsigned char*, au moyen d'un reinterpret_cast, marche
aussi, mais toute garantie ici est donnée par l'implémentation, et non
la norme (je crois).

Pour accéder à une adresse arbitraire dans l'espace d'adresses allouées
à ton processus, c'est aussi possible de convertir un int quelconque en
pointeur (sous Windows, en tout cas). À vrai dire, je ne vois pas ce
qu'on pourrait réelement en faire, en revanche, et j'aurais pas mal de
doutes sur un programme d'application qui le faisait -- à mon avis,
l'utilité de telles mainoeuvres se limite à la programmation système.

_Et/ou acceder directement à la memoire virtuelle general ? ( genre
dump)


Impossible dès que tu as un système d'exploitation digne de ce nom. Au
moins d'exécuter en mode privilégée, où il peut y avoir des requêtes
système spéciales pour le faire. (Sous Unix, par exemple, il y a un
pseudo-périphérrique, /dev/kmem, qui permet à le faire. J'imagine que
Windows offre aussi la possibilité, mais ça m'étonnerait que le
mechanisme soit pareil.)

et eventuellement, si un puriste avait trouvé la solution pour faire
du vrai C++ avec

Sans doute exactement de la même façon qu'on fait du vrai C++ avec
Posix:-) : avec beaucoup de wrappers.

et notament placer WndProc dans une classe.


Je ne connais pas WndProc, mais si c'est une fonction libre, appelée
comme fonction libre, elle ne peut pas être fonction membre
non-statique. Et si elle a un linkage "C", elle ne peut même pas être
membre statique.

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 ?)


Voir la réponse de Loïc. Mais en général (ce n'est pas propre à
Windows), les API du système sont définies en termes de C, avec des
fonctions à linkage "C". Du coup, on wrappe. Ou on utilise des wrappeurs
déjà existant.

Ce probleme est récurant lorsque l'on se lance dans la programmation
windows.


Ce problème est universel dès qu'on veut plus que ce que n'offre la
bibliothèque standard. C-à-d prèsque toujours. Je développe des serveurs
sans interface graphique sous Unix, et j'ai exactement le même
problème:-).

DirectX par exemple ou APIWindows ne sont pas adapté au C++ a cause
notament de ces callback.

Votre avis ?


Que les API "C" sont universelles, mais qu'il y a fort peu de
plate-formes qui définissent un API "C++" native (Symbian ?). C'est la
réalité, et ce n'est pas près à changer si vite. Il faut s'y faire.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Publicité
Poster une réponse
Anonyme