私はやるべきことをブラウジングしていて、ウィンドウの特定のアドレスにメモリを割り当てるというアイデアを思いつきました。
ここでいくつかの質問をスタックオーバーフローで読みましたが、実際に動作する例を示しているものはありませんでした。
#include <Windows.h>
#include <iostream>
struct Variable {
int var;
};
#define ACCESS() ((Variable*)0x50000000)
int main()
{
DWORD ptr;
VirtualAlloc((void*)0x50000000,sizeof(Variable),MEM_COMMIT | MEM_RESERVE | MEM_PHYSICAL,PAGE_READWRITE);
VirtualProtect((void*)0x50000000,sizeof(Variable),PAGE_READWRITE,&ptr);
ACCESS()->var = 5;
while(!GetAsyncKeyState('Q')){}
}
しかし、これは常にアクセス違反を引き起こします..
特定のアドレスにデータを割り当てる正しい方法は何ですか? なぜなら、この方法ではどうにかうまくいかないからです.. 同時に「どうして?」と混乱するからです。
編集:
最初の回答の後の2番目のコードも機能しません:
#include <Windows.h>
#include <iostream>
struct Variable {
int var;
};
#define ACCESS() ((Variable*)0x50000000)
int main()
{
std::cout << VirtualAlloc((void*)0x50000000,sizeof(Variable),MEM_COMMIT,PAGE_READWRITE) << std::endl;
std::cout << GetLastError() << std::endl;
ACCESS()->var = 6;
std::cout << ACCESS() << std::endl;
while(!GetAsyncKeyState('Q')){}
}
戻り値は 0 で、これは失敗を示し、GetLastError() は 487 に等しい、
このページによると、487は次のことを意味します。
ERROR_INVALID_ADDRESS; 無効なアドレスにアクセスしようとしています。
それで、私がインターネットで読んだものとスタックオーバーフローはすべて偽物ですか? 指定したアドレスにデータを配置することはできません<? これが本当なら、なぜこの関数が必要なのでしょうか?
次の編集:
それは完全に可能で、作業コードのようです:
#include <Windows.h>
#include <iostream>
struct Variable {
int var;
};
#define ACCESS() ((Variable*)0x50000000)
int main()
{
std::cout << VirtualAlloc((void*)0x50000000,sizeof(Variable),MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE) << std::endl;
std::cout << GetLastError() << std::endl;
std::cout << ACCESS() << std::endl;
ACCESS()->var = 6;
std::cout << ACCESS()->var << std::endl;
while(!GetAsyncKeyState('Q')){}
}