【问题标题】:Typecasting from struct to LPVOID从 struct 到 LPVOID 的类型转换
【发布时间】:2011-06-16 07:19:20
【问题描述】:

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

错误

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;

【问题讨论】:

    标签: c++ memory struct casting


    【解决方案1】:

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

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

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

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

    希望这会有所帮助!

    【讨论】:

    • /facepalm;好吧,不管怎样,它是一个单例,所以我只会在那里扔静态关键字。不过,感谢您提供有关“指向成员选择”的信息。
    • @Gio Borje- 如果是单例,您可以获取单例的_iat 字段的地址。这始终是一个有效的选择。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      相关资源
      最近更新 更多