从结构到LPVOID的类型转换

时间:2011-01-27 04:04:12

标签: c++ memory struct casting

在我把它扔进课堂之前工作得很好。有任何解决此类型转换错误的帮助吗?

错误

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

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

2 个答案:

答案 0 :(得分:3)

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

一起使用
CInjector myCInjector;
IAT CInjector::* ptr = &CInjector::_iat;
myCInjector.*ptr = /* ... */

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

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

希望这有帮助!

答案 1 :(得分:0)

您无法将指向成员的指针转换为指向对象的指针。 Read more here