【发布时间】:2017-04-20 12:37:40
【问题描述】:
获取接口并调用方法:
IFileOpenDialog *pFileOpen;
CoCreateInstance(__uuidof(FileOpenDialog), NULL, CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&pFileOpen));
pFileOpen->Show(NULL);
在汇编中是:
mov eax,pFileOpen
mov ecx,dword ptr [eax]
mov edx,pFileOpen
push edx
mov eax,dword ptr [ecx+ offset_Show]
call eax
也就是说ecx是指向VMT的指针,[ecx + offset_Show]是方法Show。 如何获得offset_Show,希望尽可能高。 pFileOpen->显示为指针不可编译。
【问题讨论】:
-
使用微软的 offsetof() 宏。 msdn.microsoft.com/en-us/library/dz4y9b9a.aspx
-
你必须在#include shobjidl.h 之前#define CINTERFACE,然后你可以访问vtbl 声明并且offsetof(IFileDialogVtbl, Show) 将起作用。但这对程序的其余部分具有很大的破坏性。 Google "c++ get offset of virtual function in vtbl" for the hacks。