Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C+中查找指向接口的指针地址+;?_C++_Com - Fatal编程技术网

C++ 如何在C+中查找指向接口的指针地址+;?

C++ 如何在C+中查找指向接口的指针地址+;?,c++,com,C++,Com,获取接口并调用方法: 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 ed

获取接口并调用方法:

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]是方法显示。
如何获得高水平的胶印效果。pFileOpen->Show as pointer不可编译。

要获取普通函数的地址,可以使用。另请参见获取指向类方法的函数指针


指向接口istelf的指针的地址正是您在代码中所做的:
&pFileOpen
找到了解决方案。要实现可编译性,需要单独的C源代码以获得VMT中的偏移量

C++源代码:

#include <shobjidl.h> 
#include <atlbase.h>
extern "C" int getOffsetIFileDialogVtblShow();
IFileOpenDialog *pFileOpen = ...; //get from somewhere
//pointer to VMT
unsigned char *pcFileOpen = (unsigned char *)(*(DWORD*)(unsigned char *)pFileOpen);
pcFileOpen = (unsigned char *)(*(DWORD*)pcFileOpen);
int offs = getOffsetIFileDialogVtblShow();
//pointer to Show() at pcFileOpen + offs, put hook here
fprintf(fLog,"\nFileOpenDialog::IFileOpenDialog->Show at %.8X value %.8X",pcFileOpen + offs,*(DWORD*)(pcFileOpen + offs));      
#包括
#包括
外部“C”int GetOffsetFileDialogVTBLShow();
IFileOpenDialog*pFileOpen=//出人头地
//指向VMT的指针
无符号字符*pcFileOpen=(无符号字符*)(*(DWORD*)(无符号字符*)pFileOpen);
pcFileOpen=(无符号字符*)(*(DWORD*)pcFileOpen);
int offs=GetOffsetFileDialogVTBLShow();
//指向pcFileOpen+offs处Show()的指针,将钩子放在这里
fprintf(fLog,“\nfileopeandialog::ifileopeandialog->在%.8X值%.8X处显示”,pcFileOpen+offs,*(DWORD*)(pcFileOpen+offs));
碳源

#include <stddef.h> //for offsetof
#define CINTERFACE
#include <shobjidl.h> 

int getOffsetIFileDialogVtblShow()
{
    return = offsetof(IFileDialogVtbl, Show);
}
#包括//用于抵消
#定义接口
#包括
int GetOffsetFileDialogvtblShow()
{
返回=偏移量(IFileDialogVtbl,显示);
}

使用Microsoft的offsetof()宏。您必须在包括shobjidl.h之前定义CINTERFACE,然后才能访问vtbl声明和offsetof(IFileDialogVtbl,Show)将起作用。但这对该计划的其他部分来说是极具破坏性的。谷歌“c++获取vtbl中虚拟函数的偏移量”的黑客。这不适用于接口,至少在MSVC10中是这样。void*pShow=&pFileOpen->Show;导致“错误C2276:'&”:对绑定成员函数表达式执行非法操作”。Intellisence:“绑定函数只能用于调用”。地址实际上是在调用之前按上述方式计算的,并且事先不知道,但偏移量是硬编码的!请建议可以使用的确切语法。int offs=offsetof(IFileOpenDialog,Show);-同样的错误。类似的文章,他们写道这是不可能的:。如果我正确理解您的问题,的答案可能会引导您找到解决方案。此外,请记住,如果可能,将使用
&IFileOpenDialog::Show
,而不是
&pFileOpen->Show
检索指向成员函数的函数指针。