在我上课之前,工作还不错。解决此类型转换错误有帮助吗?
错误
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
字段的地址。由于这是指特定对象的字段,因此您将获得原始指针。希望这可以帮助!