2011-01-27 41 views
1

在我将它扔到类中之前工作良好。任何帮助解决这种类型转换错误?从结构到LPVOID的类型转换

错误

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; 

回答

3

的问题是,&CInjector::_iat是一个指针到类成员,而不是一个真正的指针。由于_iat不是静态的,因此每个类都有自己的副本,所以&CInjector::_iat不是地址,而是通常是类中的偏移量。你可以用“指针到成员选择”运营商.*使用它:

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

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

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

希望这会有所帮助!

+0

/facepalm;好吧,无论如何,这是一个单身人士,所以我只会在那里抛出静态关键字。感谢有关“指向成员选择”的信息。 – 2011-01-27 04:14:53

0

您不能将指针转换为指向对象的指针。 Read more here

相关问题