GetModuleFileDirectory

http://toshi.my.land.to/table/getmodulefiledirectory/
* トップ ページ - プログラムのテーブル - GetModuleFileDirectory :: 概要 / コード / 引数 / 戻り値 / 解説

概要

実行ファイルのファイル名を含んだパスは 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 でプリインストールされていますので、
ほとんどの環境に存在はします。
それでもわずかな環境依存性を持っていますので、あえてこのように
自前で処理すれば、その問題は解決することが出来ます。

ページの先頭へ戻る
プログラムのテーブルへ戻る
トップ ページへ戻る

* トップ ページ - プログラムのテーブル - GetModuleFileDirectory :: 概要 / コード / 引数 / 戻り値 / 解説
http://toshi.my.land.to/table/getmodulefiledirectory/
(C) 2005 - 2010 Toshi, All Rights Reserved.