実行ファイルのファイル名を含んだパスは GetModuleFileName API で取得出来ますが、
実行ファイルのファイル名を除いたパスは取得する API がありません。
これは、INI ファイルなどの保存に必要なこのパスを、簡単に取得してくれる関数です。
1:
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: |
Declare Function CharPrev Lib "user32" Alias "CharPrevA" (lpszStart As BytePtr,lpszCurrent As BytePtr) As BytePtr
Function GetModuleFileDirectory (lpDirectory As BytePtr) As BytePtr If IsBadWritePtr(lpDirectory,MAX_PATH)=TRUE Then GetModuleFileDirectory=NULL Exit Function End If Dim Path[MAX_PATH] As Byte,Length As Long,i As BytePtr GetModuleFileName(NULL,Path,MAX_PATH) Length=lstrlen(Path) i=Path+Length Do If GetByte(i)=&H5C Then Exit Do i=CharPrev(Path,i) Loop SetByte(i+1,0) GetModuleFileDirectory=lstrcpy(lpDirectory,Path) End Function |
lpDirectory As BytePtr
パスを受け取るバッファへのポインタを指定します。
バッファは、少なくとも MAX_PATH の分だけ確保しておいてください。
成功すると、lpDirectory に等しい値を返します。
失敗するか、lpDirectory が指すメモリ ブロックへ少なくとも MAX_PATH の分だけ
書き込みを行うことが出来ないと、NULL を返します。
拡張エラー情報を取得するには、GetLastError API を使用します。
まずは GetModuleFileName API でファイル名も含めて取得し、
その末尾から円記号 \ を検索しています。\ は、コード 5C です。
そして \ が見つかった位置のすぐ次の文字を問答無用で NULL にし、
引数のポインタへコピーしています。
また、こんな面倒なことをしなくても shlwapi.dll に
PathRemoveFileSpec API というものがあります。これはパスから
ファイル名の部分を取り除く API です。
しかしこの DLL は、Microsoft Internet Explorer 4.0 以降が
インストールされていないと存在しません。
ちなみに IE 4.0 は Windows 98 でプリインストールされていますので、
ほとんどの環境に存在はします。
それでもわずかな環境依存性を持っていますので、あえてこのように
自前で処理すれば、その問題は解決することが出来ます。
ページの先頭へ戻る
プログラムのテーブルへ戻る
トップ ページへ戻る