Mam pytanie odnośnie pobierania liczby zmiennoprzecinkowej typu DOUBLE.
Może ktoś mi podpowie gdzie tu mam błąd w kodzie, lub jak prawidłowo to powinno wyglądać?
Samo wyszukanie adresu w pamięci zrobiłem w programie cheatengine i w tym programie wartości wyświetlają się prawidłowo, lecz w moim jest zupełnie co innego
Program główny z którego czytam w cheatengine
https://zapodaj.net/34219c2815801.png.html
Tu znaleziony adres z programu głównego wartość się zgadza z tym co wyżej.
https://zapodaj.net/aa6b938e0c37f.png.html
Tu odczyt z pamięci w moim programie katastrofa
https://zapodaj.net/8f1a2d2cdd38e.png.html
KOD cpp: UKRYJ
DWORD dwGetModuleBaseAddress(DWORD dwProcessIdentifier, TCHAR *lpszModuleName) {
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,
dwProcessIdentifier);
DWORD dwModuleBaseAddress = 0;
if (hSnapshot != INVALID_HANDLE_VALUE) {
MODULEENTRY32 ModuleEntry32 = {0};
ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
if (Module32First(hSnapshot, &ModuleEntry32)) {
do {
if (_tcscmp(ModuleEntry32.szModule, lpszModuleName) == 0) {
dwModuleBaseAddress = (DWORD)ModuleEntry32.modBaseAddr;
break;
}
}
while (Module32Next(hSnapshot, &ModuleEntry32));
}
CloseHandle(hSnapshot);
}
return dwModuleBaseAddress;
}
void __fastcall TForm1::Timer1Timer(TObject *Sender) {
HWND window = FindWindow(0, _T("Mach3 CNC Controller "));
if (window == NULL) {
Label1->Caption = " Nie znalazłem Mach3";
return;
}
else {
Label1->Caption = " Znalazłem Mach3";
}
DWORD pID = 0;
GetWindowThreadProcessId(window, &pID);
DWORD baseAddr = dwGetModuleBaseAddress(pID, _T("Mach3.exe"));
DWORD staticOffset = 0x27D740;
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
double adres;
DWORD numBytesRead;
ReadProcessMemory(handle, (LPCVOID)(baseAddr + staticOffset), &adres,sizeof(DWORD), &numBytesRead); // x
Edit1->Text = adres;
return;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,
dwProcessIdentifier);
DWORD dwModuleBaseAddress = 0;
if (hSnapshot != INVALID_HANDLE_VALUE) {
MODULEENTRY32 ModuleEntry32 = {0};
ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
if (Module32First(hSnapshot, &ModuleEntry32)) {
do {
if (_tcscmp(ModuleEntry32.szModule, lpszModuleName) == 0) {
dwModuleBaseAddress = (DWORD)ModuleEntry32.modBaseAddr;
break;
}
}
while (Module32Next(hSnapshot, &ModuleEntry32));
}
CloseHandle(hSnapshot);
}
return dwModuleBaseAddress;
}
void __fastcall TForm1::Timer1Timer(TObject *Sender) {
HWND window = FindWindow(0, _T("Mach3 CNC Controller "));
if (window == NULL) {
Label1->Caption = " Nie znalazłem Mach3";
return;
}
else {
Label1->Caption = " Znalazłem Mach3";
}
DWORD pID = 0;
GetWindowThreadProcessId(window, &pID);
DWORD baseAddr = dwGetModuleBaseAddress(pID, _T("Mach3.exe"));
DWORD staticOffset = 0x27D740;
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
double adres;
DWORD numBytesRead;
ReadProcessMemory(handle, (LPCVOID)(baseAddr + staticOffset), &adres,sizeof(DWORD), &numBytesRead); // x
Edit1->Text = adres;
return;