7

どのプロセスがロードしたかに基づいて、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 を見つけます)

4

3 に答える 3

3

char fileNamefileName 変数をまたはのように宣言した場合char fileName[MAX_PATH]、パラメータが正しくないためにエラーが発生する可能性があります: 変数のアドレスを使用します (ただし、コンパイル時エラーか実行時エラーかは指定しません。アプリがクラッシュすると言うので、ここではリチャードと一緒に行きます。変数を割り当てていません)。

次のコードを試してみました。これは、DLL 内から (DLL モジュールではなく、実行可能ファイルの名前を取得します)、または実行可能ファイル自体から動作します。
(注:以下のRemyのコメントに基づいてコードが更新されました、ありがとう)

WCHAR exePath[MAX_PATH + 1];
DWORD len = GetModuleFileNameW(NULL, exePath, MAX_PATH);
if (len > 0) {
    wcout 
       << L"Exe path" 
       << (len == MAX_PATH) ? L" (truncated):" : L":" 
       << exePath 
       << endl;
} else {
    wcout 
       << L"Error getting exe path: " 
       << GetLastError() 
       << endl;
}

注: バッファが十分に大きくない場合、GetModuleFileNameは結果を切り捨てて を返しnSizeます。

Win32 でのファイル名の処理の詳細。

于 2013-12-16T15:35:15.213 に答える
0

おそらく、ファイル名に MAX_PATH + 1 文字を割り当てていないでしょう。

于 2011-06-09T01:30:03.637 に答える