Проблема в том, что &CInjector::_iat
является указателем на член класса, а не реальным указателем. Поскольку _iat
не является статичным, каждый класс имеет свою собственную копию, и поэтому &CInjector::_iat
не является адресом, а, скорее, является смещением в классе. Вы можете использовать его с оператором «указатель на элемент выбора» .*
:
CInjector myCInjector;
IAT CInjector::* ptr = &CInjector::_iat;
myCInjector.*ptr = /* ... */
Стандарт C ++ запрещает преобразования между указателями на члены класса и необработанными указателями, поскольку они часто выглядят по-разному в памяти - указатели на члены класса часто хранят некоторое значение смещения, чтобы они правильно работали в множественном наследовании или наличие виртуальных функций, например.
Чтобы исправить это, вы, вероятно, хотите сделать одну из двух вещей. Во-первых, вы можете отметить CInjector::_iat
static
, что означает, что есть только одна его копия. Следовательно, &CInjector::_iat
теперь ссылается на конкретный объект, который действительно является обычным указателем, и приведенный выше код будет работать. Во-вторых, вы можете получить конкретный экземпляр CInjector
и затем взять адрес его поля _iat
. Поскольку это относится к полю конкретного объекта, вы получите необработанный указатель.
Надеюсь, это поможет!