gpt4 book ai didi

c++ - 如何在 C++ 中找到指向接口(interface)的指针地址?

转载 作者:行者123 更新时间:2023-11-30 05:14:17 29 4
gpt4 key购买 nike

获取接口(interface)并调用方法:

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->显示为指针不可编译。

最佳答案

已找到解决方案。为了实现可编译性,需要单独的 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源代码

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

int getOffsetIFileDialogVtblShow()
{
return = offsetof(IFileDialogVtbl, Show);
}

关于c++ - 如何在 C++ 中找到指向接口(interface)的指针地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43519775/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com