繁体   English   中英

从结构类型转换为LPVOID

[英]Typecasting from struct to 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;

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

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

C ++标准禁止在指向类成员的指针和原始指针之间进行转换,因为它们在内存中的外观常常不同-指向类成员的指针通常存储一些偏移值,以便它们在多重继承或存在虚拟的情况下都能正常工作功能。

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

希望这可以帮助!

您不能将成员的指针转换为对象的指针。 在这里阅读更多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM