どのプロセスがロードしたかに基づいて、dllでいくつかのことを行う必要があります。したがって、Windowsプログラミングに比較的慣れていないため、現在のdllをロードしたexeを見つける方法を理解するのに助けが必要です。これまでのところ、exeファイル名をハードコーディングしてきましたが、これは最もばかげたことです:D
1)GetModuleFileName()
関数の使用を提案した人がいます。しかし、これは私のアプリをクラッシュさせるようです (私はモジュールハンドルとして 0 を使用しました)。私は何も派手なことをしていません。次の構文を使用しました
GetModuleFileName(0,&fileName,MAX_PATH)
編集:ここから、dll 名のみを返すため、この呼び出しで .exe 名を取得できないことがわかりました:(
2)DllMainでこれを行うのは良い考えですか?? DllMain が複雑なことを行う場所ではないことはわかっています。ローダーロック関連の問題も理解しています。必要なのは、親プロセスの名前を見つけることだけです。
お時間をいただきありがとうございます。
追加: 親プロセス ID を取得した後、GetProcessImageFileName を使用しようとしました。アクセス違反エラーが発生します。デバッグしようとしたとき、openProcess 呼び出しが結果の引数 (イメージ ファイル パス -LPTSTR) を不適切なポインタとして残していることに気付きました。
エラー コード 87-INVALID PARAMETER は、GetProcessImageFileName 呼び出しによって返されます。
しかし、現在のプロセス ID は有効な ID です。
ここにコードがあります
LPTSTR fileName={0};
HANDLE hP=OpenProcess(PROCESS_QUERY_INFORMATION ,FALSE, processes[i]) ;
GetProcessImageFileName(hP,fileName,(DWORD)MAX_PATH+1);
私は何を間違っていますか??
ありがとう
重要な編集:
アイドル プロセスで openprocessを使用しようとしていることがわかりました。(つまり) 親プロセスを同期しているので、親プロセスがアイドル状態で待機している可能性があることを忘れていました。そのため、OpenProcess を使用してアイドル状態のプロセスを開くことができないという悪いニュースを受け取りました。アイドルプロセスのオブジェクトを調べるには、他にどのようにすればよいですか?? (スナップショットで見つけられなかったので、アイドル状態であることは確かです。enumerateprocess を使用してその ID を特定する必要がありました。ただし、スナップショットからの通常のプロセス列挙を使用して、最初に親プロセス ID を見つけます)