パス関連 Function
AutoHotkeyにDllCallが実装されてから色々テストしては中途放置を繰り返している。
とりあえずいつか使う機会のありそうな関数を貼り付けておこうかな。
コメントウザいのが素人丸出ですが。
- GetAhkDir(def_dir = "")
- Autohotkey.exeのパスを返す
- GetTempPath(lastsplit = 0)
- テンポラリフォルダのパスを取得
- GetTempFileName(PathName, PrefixString, byref TempFileName)
- テンポラリファイルを作成し名前を返す
- getProcessExeNameNT(pid)
- プロセスIDを指定して実行ファイルパスを得る
Autohotkey.exeのパスを返す
;---------------------------------------------------------- ; Autohotkey.exeのパスを返す ; 対象: AHK v1.0.23以降 ; in def_dir : デフォルトディレクトリ(省略化) ; 戻り値:Autohotkey.exeディレクトリ(末尾\なし) ;---------------------------------------------------------- GetAhkDir(def_dir = "") { ;指定ディレクトリ IfExist, %def_dir%\Autohotkey.exe ahk_dir = %def_dir% ;パス指定場所にない時は適当に検索して付け加える。 ;カレントチェック Else IfExist, %A_WorkingDir%\Autohotkey.exe ahk_dir = %A_WorkingDir% ;自身のディレクトリ Else IfExist, %A_ScriptDir%\Autohotkey.exe ahk_dir = %A_ScriptDir%\%ahk_dir% else { ;見つからない時はレジストリも読んでみる RegRead, work, HKEY_LOCAL_MACHINE, SOFTWARE\AutoHotkey, InstallDir if ErrorLevel = 0 ahk_dir = %work% ;Program Filesも探してみる。 else IfExist, %A_ProgramFiles%\AutoHotkey\Autohotkey.exe ahk_dir = %A_ProgramFiles%\AutoHotkey else ahk_dir = "" } return ahk_dir }
テンポラリフォルダのパスを取得
;-------------------------------------------------------------------- ; テンポラリフォルダのパスを取得する(winAPI GetTempPath使用) ; 対象: AHK v1.0.34以降 ; in lastsplit 0:パスの最後に\を付けない(デフォルト) ; 1:付ける ; 戻り値 : テンポラリフォルダパス ;-------------------------------------------------------------------- GetTempPath(lastsplit = 0) { ;DWORD GetTempPath(DWORD TempPathSize, LPTSTR TempPath) ; (検索順序 TMP TEMP USERPROFILE) MaxPath := VarSetCapacity(TmpPath, 260) if(!Dllcall("GetTempPath", Int,MaxPath, Str,TmpPath)) return "" ;パスが存在しないときは作ってしまえ ifNotExist, %TmpPath% FileCreateDir,%TmpPath% ;末尾 \ 処理 StringRight, work, TmpPath, 1 if (lastsplit) { if (work != "\") TmpPath := TmpPath "\" } else if (work = "\") StringTrimRight, TmpPath, TmpPath, 1 return TmpPath }
テンポラリファイルを作成し名前を返す
;-------------------------------------------------------------------- ; テンポラリファイルを作成し名前を返す。(winAPI GetTempFileName使用) ; 対象: AHK v1.0.34以降 ; in PathName ファイルを作成するパス ; PrefixString ファイル先頭につける文字列(3文字以内) ; out TempFileName 作成されたテンポラリファイル名 ; リターン値 テンポラリフォルダパス ;-------------------------------------------------------------------- GetTempFileName(PathName, PrefixString, byref TempFileName) { ; UINT GetTempFileName( ; LPCTSTR lpPathName, // ディレクトリ名 ; LPCTSTR lpPrefixString, // ファイル名の接頭辞 ; UINT uUnique, // 整数 ; LPTSTR lpTempFileName // ファイル名を格納するバッファ ; ); ;パスが存在しないときは作ってしまえ IfNotExist, %PathName% FileCreateDir,%PathName% ;テンポラリファイル作成 VarSetCapacity(TempFileName , 260) return Dllcall("GetTempFileName", Str,PathName, Str,PrefixString, UInt,0, Str,TempFileName, Uint) }
プロセスIDを指定して実行ファイルパスを得る
;------------------------------------------------------- ; プロセスIDを指定して実行ファイルパスを得る ; 対象: NT系 / AHK v1.0.34以降 ; in pid プロセスID ; 戻り値 : 実行ファイルパス ;------------------------------------------------------- getProcessExeNameNT(pid) { ; 参考: http://cgi19.plala.or.jp/lukewarm/news/2005_05.html#14 ; (ほぼそのまま) hModule=0 dwNeed=0 l=0 max:=VarSetCapacity(s,256) ; プロセスのハンドルを取り出す hProcess := DllCall("OpenProcess", Int,0x001F0FFF, Int,0, Int,pid, Int) ; このプロセスの全てのモジュールのリストの最初の1個を取得する ; BOOL EnumProcessModules(HANDLE hProcess, MODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded); if(DllCall("psapi\EnumProcessModules", Int,hProcess, IntP,hModule, Int,4, UIntP,dwNeed, Int)) { ; DWORD GetModuleFileNameEx(HANDLE hProcess, HMODULE hModule, LPTSTR FileName, DWORD FileNameSize); l:=DllCall("psapi\GetModuleFileNameExA", Int,hProcess, Int,hModule, Str,s, Int,max, Int) } StringLeft,s,s,l ; 開けたら閉める DllCall("psapi\CloseProcess", Int,hProcess) return s }