Здрасте у меня вот тут проблема с компиляцией. HEXHook.cpp Код (Text): void CPPFixes::Initialize() { WriteInstruction(0x8E799C, (INT32)CItemd::GetBodyPartFromName, 0, ASM_CALL); //Slot New } CItem.cpp Код (Text): int CItemd::GetBodyPartFromName(int nLen, WCHAR* wcsName) { if(_wcsicmp(wcsName, L"bracelet") == 0) return 0x200000; else if(_wcsicmp(wcsName, L"talisman") == 0) return 0x100000; else if(_wcsicmp(wcsName, L"face") == 0) return 0x40000; else if(_wcsicmp(wcsName, L"lhair") == 0) return 0x10000; else { typedef int (__fastcall*_TFUNC)(int, WCHAR*); _TFUNC _FUNC = (_TFUNC)0x8E76F0; return _FUNC(nLen, wcsName); } }; CItem.h Код (Text): class CItemd { public: int GetBodyPartFromName(int nLen, WCHAR* wcsName); }; У меня ошибка Error 9 error C2440: 'type cast' : cannot convert from 'int (__cdecl CItemd::* )(int,WCHAR *)' to 'INT32' d:\2Ex\L2E\CPPFixes.cpp 27 Как лечица я в прогнраммировании не оч сильно опытен...
Error 1 error C2440: 'type cast' : cannot convert from 'int (__cdecl CItemd::* )(int,WCHAR *)' to 'void *' d:\L2E\L2E\CPPFixes.cpp 27 Всеравно.
Указатель на метод просто так в void* не прокастишь. Следующее работает на некоторых компиляторах (MSVC). Код (Text): typedef int (CItemd::*pGetBodyPartFromName)(int, WCHAR*); union Caster { pGetBodyPartFromName ptrval; INT32 intval; } ... Caster c; c.ptrval = &CItemd::GetBodyPartFromName; WriteInstruction(0x8E799C, c.intval, 0, ASM_CALL); Учти, что с виртуальными методами такой фокус не пройдёт.
Я же писал что я неочень опытен, был бы я кул программер наверно бы у меня бы небыло проблем... Так что нуждаюсь пока в советах
Советую сохранять не int-ы, а указатели на методы, избежав ненужных преобразований. Ещё для меня удивительно это - "_TFUNC _FUNC = (_TFUNC)0x8E76F0;"
Попробуй такое. Код (Text): typedef int (CItemd::*p)(int, WCHAR*); p p1 = &CItemd::GetBodyPartFromName; int i = (int&)p1; Всё равно не понимаю в этом смысла.
Должно быть Код (Text): static int GetBodyPartFromName(int nLen, WCHAR* wcsName); Функции-члены класса вызываются по-другому (им ещё нужен указатель this), нежели обычные функции (и статические функции), так что компилятор доступными ему способами мешает выстрелить себе в ногу.
diamond При чём здесь вызов метода и выстрелить в ногу? Сомнительно преобразование в int, хотя чего только не бывает на практике.
int (CItemd::*ptr)(int, WCHAR*) = &CItemd::GetBodyPartFromName; WriteInstruction(0x8E799C, *(INT32*)&ptr, 0, ASM_CALL);
Это уже ошибка линковки, то есть компилятор успешно проглотил код. Unresolved external symbol означает, что линковщик не видит, где реализована функция. Скорее всего, из-за того, что CItem.cpp не компилируется или не подаётся на вход линковщику.