Bonjour,

je cherchais un code pour obtenir dynamiquement le rang dans la VMT d'une méthode virtuelle, voila la solution que j'ai trouvée qui devrait marcher avec tous les compilateurs/processeurs :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 
// CPPVmtRank.cpp : dynamically obtain VMTRank from a pointer to a virtual method
 
#define __Meth(N) virtual int DummyMethod##N() { return 0x##N; }
#define __MethX(N) __Meth(N##0) __Meth(N##1) __Meth(N##2) __Meth(N##3) \
				   __Meth(N##4) __Meth(N##5) __Meth(N##6) __Meth(N##7) \
				   __Meth(N##8) __Meth(N##9) __Meth(N##A) __Meth(N##B) \
				   __Meth(N##C) __Meth(N##D) __Meth(N##E) __Meth(N##F)
 
#define __MethXX(N) __MethX(N##0) __MethX(N##1) __MethX(N##2) __MethX(N##3) \
				    __MethX(N##4) __MethX(N##5) __MethX(N##6) __MethX(N##7) \
				    __MethX(N##8) __MethX(N##9) __MethX(N##A) __MethX(N##B) \
				    __MethX(N##C) __MethX(N##D) __MethX(N##E) __MethX(N##F)
 
class DummyClass {
public:
	__MethXX(0) __MethXX(1) __MethXX(2) __MethXX(3)
	__MethXX(4) __MethXX(5) __MethXX(6) __MethXX(7)
	__MethXX(8) __MethXX(9) __MethXX(a) __MethXX(b)
	__MethXX(c) __MethXX(d) __MethXX(e) __MethXX(f)
        ///4096 DummyMethods
};
 
DummyClass dummyObj;
 
class A {
public:
	virtual void Meth0();
	virtual void Meth1();
	virtual void Meth2();
	virtual void Meth3();
	virtual void Meth4();
	virtual void Meth5();
	virtual void Meth6();
};
 
template <typename T> int GetVMTRank(T t) {
	int (DummyClass::*methPtr)();
	*(void**)&methPtr = *(void**)&t;
	return (dummyObj.*methPtr)();
}
 
int main() {
	int Meth0_VMTRank = GetVMTRank(&A::Meth0);
	int Meth6_VMTRank = GetVMTRank(&A::Meth6);
}
je pense que le seul truc qui peut faire crasher c'est si le compilateur s'amuse à ne pas mettre dans la VMT les méthodes dans l'ordre de leur déclaration,
dans ce cas il est possible de créer une DummyClass par DummyMethod (DummyClass9 héritant de DummyClass8) pour obliger le compilateur à mettre les DummyMethod dans l'ordre.