2016-07-13 2 views
-3

を追加することはできません私のコードは簡単で、は2つのポインタ

#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); 
    } 
} 

のような非常に簡単なように見えた。しかし、それはエラーを与える:

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

誰かが私が間違ってやっているものを私に伝えることができます。私はちょうど

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

あなたが追加することはできません。ポインターへのポインタ、それは意味をなさない、それはそのコードがデルファイで何をするのか明確ではない – Slava

+0

ポインタは、エンベロープが郵便番号を含むように、メモリ内のアドレスの位置を含む。郵便住所の追加は、ポインタの追加が意味をなさないようには意味がありません。ポインタに* offset *を加えることができます。 –

+4

あなたの質問にコードの写真を載せないでください。コードをテキストとして貼り付けるだけです。 – Johan

答えて

-1

PDWORDDWORDP ointerの別名であるC++でのDelphi関数を再書きたいです。 ADDR_cabalbase(その種類は問わない)をPDWORD、へのポインタ、つまりDWORDへのポインタへのポインタに、へキャストしようとしています。次に、PDWORD、つまりDWORDへのポインタを取得して、逆参照します。次に、これらを一緒に追加しようとします。解決策をコメント@drescherjmする

+0

親愛なるdownvoter、何が間違って答えを説明するために気をつけますか?私はそれを改善してうれしいです。 – Angew

-1

おかげである:

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

    } 
+2

このコードは、Delphiコードと同じロジックではありません。 Delphiのコードは 'cabalbase'アドレスにある' WORD'( 'DWORD'!ではなく)の値を逆参照し、THENはその値に0を加えた後、その結果を' PDWORD'にキャストし、 'DWORD'値を得るために逆参照します。その値に 'ONat'を追加し、結果をキャストし、そこから' DWORD'値を逆参照します。上のコードは何か違いがあります。 'cabalbase'自体にゼロを追加していますが、' WORD'はそれを指していません。そして、あなたは 'ONat'を加えた後に得られたアドレスにある' DWORD'値をキャスト+逆参照していません。 –

3

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

DelphiコードがPWORDWORDへのポインタ)とPDWORDDWORDへのポインタ)に数値を落としているが、あなたはすべてをキャストしています代わりにPDWORD*DWORDへのポインタへのポインタ)に。 PDWORDは既にポインタなので、*を削除する必要があります。 cabalbaseの最初のキャストは、PDWORDではなく、PWORDになります。逆参照するとPWORDは2バイトを読み込みますが、逆参照するとPDWORDは4バイトを読み込みます。それは大きな違いになります。

これは、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) { 
     // ... 
    } 
} 

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) { 
     // ... 
    } 
} 
関連する問題