SHOJI's Code
 仕事や趣味で書いた各種言語のプログラミングコード(エクセルVBA,PHP,C/C++/C#,JavaScript等)、その他雑記。
2017.08<<123456789101112131415161718192021222324252627282930>>2017.10
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

以前 Windows 3.1 で作成したシステムの更新を現在手がけていて、そのとき作ったユーティリティを WIN32 でコンパイルしなおしていた。

が、そこで困ったことがあった。
イベント情報を受信し、管理する EXE があり、そのイベント情報の取得はその EXE へウィンドウメッセージを使用して取得するようになっていた。そのときに lParam には構造体のポインタを渡すようにしていたのだ。Windows 3.1 (WIN16)のときにはそれで問題なく動いていたが、WIN32では、プロセス間で直接アドレスを渡してもアクセスできない (アクセス違反が発生する)

で、いろいろ調べてみたら VirtualAllocEx なる便利な関数を発見。
で、書き直したのが下記のコード


static LPVOID PASCAL alloc_mem(LPVOID p, int c, HANDLE *h)
{
LPVOID ps;
DWORD pid, n;

*h = NULL;
GetWindowThreadProcessId(hwndToCall, &pid);
if( (*h = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, FALSE, pid)) )
{
ps = VirtualAllocEx(*h, NULL, c, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
if( ps!=NULL )
WriteProcessMemory(*h, ps, p, c, &n);
else
debug("unable to allocate process memory.");
return ps;
}

debug("unable to open process for downloader.");
return NULL;
}

static VOID PASCAL free_mem(HANDLE h, LPVOID p)
{
if( h!=NULL && p!=NULL ) VirtualFreeEx(h, p, 0, MEM_RELEASE);
if( h != NULL ) CloseHandle(h);
}

static int PASCAL GetEventStatus(LPEVTSTAT lpevs, int index)
{
HANDLE h;
LPEVTSTAT p;
int ret = 0;
DWORD n;

if( (p = alloc_mem(lpevs, sizeof(EVTSTAT), &h)) != NULL )
{
ret = (int)SendMessage(hwndToCall, msgGetEventStatus, (WPARAM)index, (LPARAM)p);
ReadProcessMemory(h, p, lpevs, sizeof(EVTSTAT), &n);
}

free_mem(h, p);

return ret;
}


テーマ:プログラミング - ジャンル:コンピュータ
コメント
この記事へのコメント
コメントを投稿する

管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
copyright © 2004-2006 SHOJI, Powered By FC2ブログ all rights reserved.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。