2016-07-13 6 views
-3

Mein Code einfach ist und schien sehr einfach zu seinKann hinzufügen, nicht 2 Zeiger

#include <cstdint> 
#include <windows.h> 
#define ADDR_cabalbase 0x01083A90 
#define ADDR_ONat 0x35c 
#define ZeroOFS 0x0 
int main() 
{ 


    if ((*reinterpret_cast<PDWORD *>(ADDR_cabalbase)+*reinterpret_cast<PDWORD *>(ZeroOFS)) 
     + *reinterpret_cast<PDWORD *>(ADDR_ONat) 
     == 3){ 
     ExitProcess(0); 
    } 
} 

Aber es gibt einen Fehler:

Error 1 error C2110: '+' : cannot add two pointers 

Kann mir jemand sagen, was ich falsch mache. Ich möchte nur eine Delphi-Funktion in C++

procedure TWanda.Timer5Timer(Sender: TObject); 
begin 
    try 
    if PDWORD(PDWORD(PWORD(cabalbase)^+$0)^+ONat)^ = 3 then 
    begin 
     timer9.Enabled:= true; 
    end; 
    except {ignore errors} end; 
end; 
+1

Sie können nicht hinzufügen Zeiger auf Zeiger, der keinen Sinn macht, ist nicht klar, was dieser Code in Delphi tut – Slava

+0

Ein Zeiger enthält den Speicherort einer Adresse im Speicher, ähnlich einem Umschlag enthält eine Postanschrift. Das Hinzufügen von Postadressen ist nicht sinnvoll, da das Hinzufügen von Zeigern keinen Sinn ergibt. Sie können einem Zeiger einen * Offset * hinzufügen. –

+4

Bitte stellen Sie keine Bilder von Code in Ihre Frage. Fügen Sie den Code einfach als Text ein. – Johan

Antwort

-1

PDWORD ist ein Alias-Name für ein P ointer zu DWORD neu schreiben. Sie werfen ADDR_cabalbase (was auch immer sein Typ ist) auf einen Zeiger auf einen PDWORD, das heißt, auf einen Zeiger auf einen Zeiger auf einen DWORD. Dann dereferenzieren Sie das, indem Sie eine PDWORD, dh einen Zeiger auf eine DWORD erhalten. Dann versuchst du, diese zusammen hinzuzufügen.

+0

Lieber Downvoter, kümmern, um zu erklären, was mit der Antwort falsch ist? Ich würde mich freuen, es zu verbessern. – Angew

-1

Dank der Lösung @drescherjm Kommentar ist:

if (*reinterpret_cast<DWORD *>(ADDR_cabalbase+ZeroOFS 
     + ADDR_ONat) 
     == 0){ 

    } 
+2

Dieser Code ist NICHT dieselbe Logik wie im Delphi-Code. Der Delphi-Code dereferenziert den 'WORD'-Wert (nicht' DWORD'!), Der an der 'cabalbase'-Adresse liegt, THEN addiert Null zu diesem Wert, dann wirft er das Ergebnis auf' PDWORD' und dereferenziert es, um einen 'DWORD'-Wert zu erhalten, fügt 'ONat' zu diesem Wert hinzu, wandelt das Ergebnis um und dereferenziert einen 'DWORD'-Wert daraus. Dein Code oben macht etwas Unterschied. Sie fügen "cabalbase" selbst 0 hinzu, nicht das "WORD", auf das es zeigt.Und Sie werten den DWORD-Wert nicht + deneferenziert auf die Adresse, die nach dem Hinzufügen von ONat erhalten wird. –

3

I just want to re-write a Delphi function in C++

Der Delphi-Code numerische Werte PWORD (Zeiger auf WORD) und PDWORD (Zeiger auf DWORD) wirft, aber Sie alles werfen zu PDWORD* (Zeiger auf Zeiger zu DWORD) stattdessen. Sie müssen die * löschen, da PDWORD bereits ein Zeiger ist. Und die erste Besetzung von cabalbase ist eine PWORD, nicht eine PDWORD. Beim Dereferenzieren einer PWORD werden 2 Bytes gelesen, während beim Dereferenzieren einer PDWORD stattdessen 4 Bytes gelesen werden. Das macht einen großen Unterschied.

Dies ist die richtige Übersetzung des Codes Delphi:

#include <windows.h> 

#define ADDR_cabalbase 0x01083A90 
#define ADDR_ONat 0x35c 
#define ZeroOFS 0x0 

int main() 
{ 
    if (*reinterpret_cast<PDWORD>(*reinterpret_cast<PDWORD>(*reinterpret_cast<PWORD>(ADDR_cabalbase) + ZeroOFS) + ADDR_ONat) == 3) { 
     // ... 
    } 
} 

würde ich vorschlagen, einige lokale Variablen es leichter zu lesen (und debug):

int main() 
{ 
    WORD w_cabalbase = *reinterpret_cast<PWORD>(ADDR_cabalbase); 

    DWORD dw_cabalbase_ofs = *reinterpret_cast<PDWORD>(w_cabalbase + ZeroOFS); 

    DWORD dw_onat = *reinterpret_cast<PDWORD>(dw_cabalbase_ofs + ADDR_ONat); 

    if (dw_onat == 3) { 
     // ... 
    } 
} 
Verwandte Themen