2017-11-23 29 views
0

私はちょうどWinAPIの学習を始めました。私は関数のさまざまな変数を見つけました。 今、私はReadProcessMemoryで苦労しています。 コードは次のとおりです。C++ WinAPI ReadProcessMemory

ReadProcessMemory(phandle, (LPVOID)address, &value , sizeof(value), 0); 

今、私は最初のパラメータは、プロセスへのハンドルですが、2番目のパラメータ(ベースアドレスへのポインタ)は、ボイド(LPVOID)のでなければならない理由を私は理解していないことを理解しますアドレス。

MSDNでそれは言う: 読み取るのに指定されたプロセスのベースアドレスへのポインター。データ転送が行われる前に、システムは、ベースアドレスのすべてのデータと指定されたサイズのメモリに読み取りアクセスが可能であることを確認し、アクセスできない場合は機能が失敗します。

なぜ、2番目のパラメータのアドレスだけでなく、(LPVOID)アドレスである必要がありますか?

+1

LPVOIDは空白の_ポインタです。私。 'void *'を返します。 –

+0

あなたはなぜそれが必要であると思いますか? – MSalters

答えて

4

まあ、lpBaseAddressは...アドレスなので、その型はポインタでなければなりません。どのようなタイプが指していますか?私たちは知らないし、これ(WinApi)はCなので、テンプレートもないので、void *です。また、メモリを変更したくないので、constが適切です。

あなたの編集について(なぜキャストか):それはaddressのタイプによって異なります。 volatile以外のオブジェクトポインタは暗黙的にvoid const *に変換できます。この場合、キャストは不要です。しかし、そのアドレスは既知のinteger定数であると仮定します。この場合、ポインタにするにはreinterpret_castが必要です。これはここではCスタイルのキャストの貧弱なスタイルで行われますが、同じように実現します。

+0

非常にクエンティンありがとうございます。 – DavisR5