gpt4 book ai didi

c++ - 从结构到 LPVOID 的类型转换

转载 作者:行者123 更新时间:2023-11-30 03:08:37 28 4
gpt4 key购买 nike

在我将其投入类之前,它运行良好。对解决此类型转换错误有任何帮助吗?

错误

error C2440: 'type cast' : cannot convert from 'IAT CInjector::* ' to 'LPVOID'

代码引用

WriteProcessMemory(CInjector::_hProc, 
CInjector::_iatBaseAddress,
(LPVOID) & CInjector::_iat, // typecasting error?
sizeof (IAT),
NULL);

class CInjector
{
private:
...
IAT _iat;
...
}

类型定义

typedef struct _IAT {
PLOADLIBRARYA pLoadLibraryA;
PGETPROCADDRESS pGetProcAddress;
FNMESSAGEBOX fnMessageBox;
} IAT;

最佳答案

问题是 &CInjector::_iat 是指向类成员的指针,而不是真正的指针。由于 _iat 不是静态的,每个类都有自己的拷贝,因此 &CInjector::_iat 不是地址,而是通常是类的偏移量.您可以将它与“成员选择指针”运算符一起使用 .*:

CInjector myCInjector;
IAT CInjector::* ptr = &CInjector::_iat;
myCInjector.*ptr = /* ... */

C++ 标准禁止在指向类成员的指针和原始指针之间进行转换,因为它们在内存中通常看起来不同——指向类成员的指针通常存储一些偏移值,以便它们在多重继承或例如,存在虚函数。

要解决此问题,您可能需要执行以下两项操作之一。首先,你可以标记CInjector::_iat static,这意味着它只有一个拷贝。因此,&CInjector::_iat 现在引用一个具体对象,它确实是一个常规指针,并且上面的代码将起作用。其次,您可以获得 CInjector 的具体实例,然后获取其 _iat 字段的地址。由于 this 指的是特定对象的字段,您将得到一个原始指针。

希望这对您有所帮助!

关于c++ - 从结构到 LPVOID 的类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4812618/

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