他のアプリの起動パスを取得する
|
> (ウィンドウハンドルの場合)
> GetWindowLong(hwnd, GWL_HINSTANCE) でモジュールハンドルを取り出す。
> (モジュールハンドルの場合)
> GetModuleFileName(hModule, strBuffer, nBufferSize) でファイル名を得る。
残念ですがこの方法では、他のアプリの起動パス は取得できません。自分自身のExe名しか取得できません。(私も最初はこれではまった。)(^.^)
モジュールハンドルはプロセス毎に独立して管理されるので、他のアプリ(他のプロセス)のモジュールハンドルを持ってきても意味がありません。
http://www.microsoft.com/japan/support/kb/articles/J041/6/32.htm
にシステム内で稼働中のプロセスを列挙する方法がでてますから、参考にしてください。ウィンドウハンドルが判っているのでしたら、
GetWindowthreadProcessID でプロセスIDを求めて、列挙中にこれと合致するプロセスを探せばよいでしょう。
たとえば、Win95/98用(WinNTではダメ)ですが、
uses TLHelp32;
// ハンドルからファイル名を得る
function GetProcesFileNameFrom(Handle: hWnd):string;
var
PID: DWORD;
SnapShot: THandle;
ProcessEntry32: TProcessEntry32;
begin
// ハンドルから作成スレッドを調べてプロセスIDを得る
GetWindowThreadProcessId(Handle, @PID);
// TProcessEntry32構造体の初期化
ProcessEntry32.dwSize := SizeOf(TProcessEntry32);
// システム中の情報のスナップショットをとる
SnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
try
// 最初のプロセスの検索
if Process32First(SnapShot, ProcessEntry32) then
begin
repeat
// IDが一致したら
if ProcessEntry32.th32ProcessID = PID then
begin
Result := string(ProcessEntry32.szExeFile);
break;
end;
// 次のプロセスの検索
until Process32Next(SnapShot, ProcessEntry32) = False;
end;
finally
CloseHandle(SnapShot);
end;
end;
などです。
|
|