最近我一直在搞乱VTables和虚拟指针, 并且我发现来自同一类类型的每个vptr(应该)指向相同的VTable。(它们指向相同的地址)。
我已经搜索了有关COM对象如何工作的信息,并且我发现它们也共享相同的VTable。(同一类的对象)
https://www.codeproject.com/articles/153096/intercepting-calls-to-com-interfaces]
首先,当您设置方法钩子时,它不仅适用于COM对象的当前实例。它适用于同一个类的所有对象(但不适用于实现挂钩接口的所有类)。
我遇到的问题如下:我在一个测试应用程序中创建了3个不同的d3d9设备,我检查了它们指向VTable的指针,但它们不一样!
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
if (NULL == (g_pD3D2 = Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof( d3dpp ) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
D3DPRESENT_PARAMETERS d3dpp2;
ZeroMemory(&d3dpp2, sizeof(d3dpp2));
d3dpp2.Windowed = TRUE;
d3dpp2.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp2.BackBufferFormat = D3DFMT_UNKNOWN;
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
{
return E_FAIL;
}
if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp2, &g_pd3dDevic)))
{
return E_FAIL;
}
WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC,TempWProc,0L,0L,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,(LPCWSTR)("1"),NULL };
RegisterClassEx(&wc);
HWND hWndd = CreateWindow((L"1"), NULL, WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, GetDesktopWindow(), NULL, wc.hInstance, NULL);
if (FAILED(g_pD3D2->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWndd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_DISABLE_DRIVER_MANAGEMENT,
&d3dpp2, &g_pd3dDevic3)))
{
return E_FAIL;
}
(作为最后的手段,我还创建了一个不同的窗口并初始化了一个新的D3D接口,以防它使新的d3d9设备指向同一个VTable。)
在调试器中,我检查了设备指针的值,这就是它们产生的结果:
g_pd3dDevice(The first one) : __vfptr = 0x00b75d1c { 0x6a976f19 }
g_pd3dDevic(The second one) : __vfptr = 0x0512a75c { 0x6a976f19 }
g_pd3dDevic3(The third one) : __vfptr = 0x0524393c { 0x6a976f19 }
3个VTable是相同的,但它们位于不同的地方。 (三个指针指向相同的功能) (我还检查了VTable是否被对象的0x2D9C所取代) 所以这就是我真正理解的:
为什么他们不像COM对象那样使用相同的VTable,如我所给出的链接所指示的那样?
在同一个HWND中有多个设备有问题吗?
非常感谢您阅读这段文字,非常感谢。
提前致谢!!! (对不起,如果这是一个非常愚蠢的问题)