Как минимум - у Вас несоответствие кодировок. ANSI программа использующая ANSI версии функций winApi у Вас принимает в качестве аргументов const wchar_t * (строки L"..."), что является ошибкой.Хочу получить ники всех игроков на сервере.
C++:int main() { DWORD pID; char moduleName[] = "samp.dll"; HWND hGameWindow = FindWindow(NULL, L"GTA:SA:MP"); GetWindowThreadProcessId(hGameWindow, &pID); HANDLE pGta = OpenProcess(PROCESS_VM_READ, FALSE, pID); DWORD pSamp = GetModuleBaseAddress(pID, L"samp.dll"); cout << "samp.dll addr: " << hex << pSamp << endl; char nickname[24] = { " " }; ReadProcessMemory(pGta, (LPCVOID)(pSamp + OFFSET_NICKNAME), &nickname, sizeof(nickname), NULL); DWORD dwAddress; ReadProcessMemory(pGta, (LPCVOID)(pSamp + 0x21A0F8), &dwAddress, 4, 0); cout << "dwAdress : " << dwAddress << endl; ReadProcessMemory(pGta, (LPCVOID)(dwAddress + 0x3CD), &dwAddress, 4, 0); cout << "dwAdres : " << dwAddress << endl; DWORD dwPlayers; ReadProcessMemory(pGta, (LPCVOID)(dwAddress + 0x18), &dwPlayers, 4, 0); //stPlayerPool cout << "dwPlayers : " << dwPlayers << endl; cout << endl << endl; uint32_t ulMaxPlayerID; ReadProcessMemory(pGta, (LPCVOID)(dwPlayers), &ulMaxPlayerID, sizeof(uint32_t), 0); //ulMaxPlayerID cout << "ulMaxPlayerID : " << ulMaxPlayerID << endl; uint16_t sLocalPlayerID; ReadProcessMemory(pGta, (LPCVOID)(dwPlayers + sizeof(uint32_t)), &sLocalPlayerID, sizeof(uint16_t), 0); //sLocalPlayerID cout << "sLocalPlayerID : " << sLocalPlayerID << endl; //0x2a stRemotePlayer* pRemotePlayer[SAMP_MAX_PLAYERS]; ReadProcessMemory(pGta, (LPCVOID)(dwPlayers + 0x2a), &pRemotePlayer, 4, 0); cout << "pRemotePlayer : " << pRemotePlayer << endl; cout << "nick : " << pRemotePlayer[5]->strPlayerName << endl; }
Но получаю либо кашу либо краш.
А как более - хороший пример по external получению списка игроков написан в samp udf for ahk. Все оффсеты есть в верхней части файла в массивах, где 1, 2, 3 позиции соответствуют версиям 0.3.7r1, r2, 0.3dl с поправкой для global SAMP_REMOTEPLAYERDATA_PED := [0x2A4, 0x40, 0x40].
Также для определения причин вылета лучше применять отладчик, т.к. сообщение "у меня крашит" практически не несет в себе полезной нагрузки, а узнать причины краша Вы можете самостоятельно.
Вероятно, дело в выравнивании структур компилятором. Статья 1, Статья 2Вопрос:
Есть такая структура:
C++:struct stSAMP { void *pUnk0[2]; uint8_t byteSpace[24]; char szIP[257]; char szHostname[259]; uint8_t byteUnk1; uint32_t ulPort; uint32_t ulMapIcons[100]; int iLanMode; int iGameState; uint32_t ulConnectTick; struct stSAMPSettings *pSettings; void *pRakClientInterface; struct stSAMPPools *pPools; };
Но в cheat engine она выглядит совсем не так, данные то в ней есть, вроде IP и Hostname, но они расположены на каких-то непонятных оффсетах, почему структура в C++ выглядит не так, как в CheatEngine, смотрел еще некоторые структуры - так там данные в CE расположены в том же порядке, что и в C++