BYTE* zu unsigned in HEX
-
Ich bekomme die Zahl einfach nicht als Hexadezimale Zahl in ein unsigned geschrieben..
Bei Fenstertitel einfach "Module Leser" eingeben.
Ätzenderweise ist auf "Str" nicht die Gleiche Zahl wie vorher ausgegeben.#include <iostream> #include <windows.h> #include <tlhelp32.h> #include <sstream> using namespace std; int main() { SetConsoleTitle("Module Leser"); DWORD dwProcessId; string strTitel; MODULEENTRY32 lpModuleEntry; HWND hWnd; stringstream Str; unsigned int BASIS_HIER; while(1){ do{ cout << "Fenstertitel: "; getline(cin, strTitel); hWnd = FindWindow(0, strTitel.c_str()); }while(!hWnd); cout << endl; GetWindowThreadProcessId(hWnd, &dwProcessId); HANDLE hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId); HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId); if(!hSnapShot||!hproc) return 0; lpModuleEntry.dwSize = sizeof(lpModuleEntry); BOOL bModule = Module32First(hSnapShot, &lpModuleEntry); while(bModule) { cout << lpModuleEntry.szModule << "\t\t" << hex << (DWORD)lpModuleEntry.modBaseAddr << endl; if(lpModuleEntry.szModule == "kernel32.dll") Str << hex << (unsigned)lpModuleEntry.modBaseAddr; bModule = Module32Next(hSnapShot, &lpModuleEntry); } CloseHandle(hSnapShot); cout << endl << Str << endl << endl; } }
-
Kürze den Code aufs wesentliche. Was soll das ganze Windowszeugs?
cout << endl << Str << endl << endl;Hier gibst du einen Stream aus. Macht vermutlich nicht das, was du denkst, was es macht.
Ich bekomme die Zahl einfach nicht als Hexadezimale Zahl in ein unsigned geschrieben..
Entweder drückst du dich dumm aus oder das Vorhaben ist Quatsch. Arithmetische Datentypen (wie unsigned int) speichern den Wert einer Zahl, keine spezielle Darstellung.
-
cout << endl << Str << endl << endl;Hier gibst du einen Stream aus. Macht vermutlich nicht das, was du denkst, was es macht.
-Ich nehme an der Stream müssten den gleichen Wert wie eine Zahl ausgeben(?)
Ich bekomme die Zahl einfach nicht als Hexadezimale Zahl in ein unsigned geschrieben..
Entweder drückst du dich dumm aus oder das Vorhaben ist Quatsch. Arithmetische Datentypen (wie unsigned int) speichern den Wert einer Zahl, keine spezielle Darstellung.[/quote]
-Gut, ich habe stringstream nur benutzt um die Zahl von Dezimal in Hexadezimal umzurechnen. Bzw ich möchte das Ergebnis von lpModuleEntry.modBaseAddr in Hexadezimal umrechnen, und dieses Ergebnis in einen unsigned packen o.O
-
cout << (unsigned)lpModuleEntry.modBaseAddr;
Gibt mir den richtigen Wert aus.
unsigned int BASIS_HIER;
BASIS_HIER = (unsigned)lpModuleEntry.modBaseAddr;
cout << BASIS_HIER;Gibt mir den falschen Wert. DWORD will auch nicht.
-
Okay hat sich erledigt. Ich dachte mir schon die ganze Zeit daß ich einen Logik-Fehler habe.

cout << hex konvertiert auch das Zukünftige und der unsigned kann zugewiesen werden. Google wird's Danken.
-
Außerdem braucht man strcmp.
-
moinsen schrieb:
cout << endl << Str << endl << endl;Hier gibst du einen Stream aus. Macht vermutlich nicht das, was du denkst, was es macht.
-Ich nehme an der Stream müssten den gleichen Wert wie eine Zahl ausgeben(?)
Jetzt rate mal, warum ich wohl gesagt habe, dass es vermutlich nicht das macht, was du denkst, was es macht.
Ich bekomme die Zahl einfach nicht als Hexadezimale Zahl in ein unsigned geschrieben..
Entweder drückst du dich dumm aus oder das Vorhaben ist Quatsch. Arithmetische Datentypen (wie unsigned int) speichern den Wert einer Zahl, keine spezielle Darstellung.
-Gut, ich habe stringstream nur benutzt um die Zahl von Dezimal in Hexadezimal umzurechnen. Bzw ich möchte das Ergebnis von lpModuleEntry.modBaseAddr in Hexadezimal umrechnen, und dieses Ergebnis in einen unsigned packen o.O
Jetzt hast du wiederholt gesagt, dass du das machen möchtest, wovon ich dir gerade eben gesagt habe, dass es nicht geht. Das ist so, als wolltest du eine Zahl hexadezimal auf einem Rechenschieber speichern. Das macht einfach keinen Sinn! Hexadezimal ist eine Darstellung, eine Folge von Zeichen. Integer speichern Zahlenwerte, unabhängig von irgendeiner Darstellung.
-
Integer speichern Zahlenwerte, unabhängig von irgendeiner Darstellung.
Das ist offenbar ungünstig formuliert, wo doch der Standard spezifisch von einer Darstellung (representation) spricht und sogar festlegt dass diese binär sein muss.
§3.9.1/7 schrieb:
The representations of integral types shall define values by use of a pure binary numeration system.
Aber hier liegt ja auch der Witz: Ein
intwird einen Wert stets binär darstellen, und kennt daher gar keine anderen Zahlbasen.
-
Arcoth schrieb:
Integer speichern Zahlenwerte, unabhängig von irgendeiner Darstellung.
Das ist offenbar ungünstig formuliert, wo doch der Standard spezifisch von einer Darstellung (representation) spricht und sogar festlegt dass diese binär sein muss.
§3.9.1/7 schrieb:
The representations of integral types shall define values by use of a pure binary numeration system.
Aber hier liegt ja auch der Witz: Ein
intwird einen Wert stets binär darstellen, und kennt daher gar keine anderen Zahlbasen.Guter Einwand! Den Absatz habe ich irgendwie vergessen, weil er nie von Belang ist. Dann formuliere ich um:
Ganzzahldatentypen speichern Zahlenwerte. Intern werden diese zwar immer binär dargestellt, was aber niemals von Belang ist, außer man lässt sich tatsächlich mal eine Variable Byte für Byte ausgeben.
-
Intern werden diese zwar immer binär dargestellt, was aber niemals von Belang ist, außer man lässt sich tatsächlich mal eine Variable Byte für Byte ausgeben.
... oder man arbeitet auf Bitebene.
-
Nur ein kleiner Einwurf: Bitt einen
xxxptr_tbzw.XXX_PTRTypen verwenden wenn man Zeiger in Integers konvertieren möchte/muss.
Also z.B.intptr_toderuintptr_taus dem Standard oderINT_PTR,UINT_PTRoderDWORD_PTRvom Windows SDK.Sonst stehen die Chancen schlecht wenn man mal ne 64 Bit Version laufen lassen möchte.