Типизация от структуры до LPVOID - PullRequest
1 голос
/ 27 января 2011

Хорошо работал, прежде чем я бросил его в класс.Любая помощь для устранения этой ошибки в типизации?

Ошибка

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 ]

3 голосов
/ 27 января 2011

Проблема в том, что &CInjector::_iat является указателем на член класса, а не реальным указателем. Поскольку _iat не является статичным, каждый класс имеет свою собственную копию, и поэтому &CInjector::_iat не является адресом, а, скорее, является смещением в классе. Вы можете использовать его с оператором «указатель на элемент выбора» .*:

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

Стандарт C ++ запрещает преобразования между указателями на члены класса и необработанными указателями, поскольку они часто выглядят по-разному в памяти - указатели на члены класса часто хранят некоторое значение смещения, чтобы они правильно работали в множественном наследовании или наличие виртуальных функций, например.

Чтобы исправить это, вы, вероятно, хотите сделать одну из двух вещей. Во-первых, вы можете отметить CInjector::_iat static, что означает, что есть только одна его копия. Следовательно, &CInjector::_iat теперь ссылается на конкретный объект, который действительно является обычным указателем, и приведенный выше код будет работать. Во-вторых, вы можете получить конкретный экземпляр CInjector и затем взять адрес его поля _iat. Поскольку это относится к полю конкретного объекта, вы получите необработанный указатель.

Надеюсь, это поможет!

0 голосов
/ 27 января 2011

Вы не можете преобразовать указатель на элемент в указатель на объект. Подробнее здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...