執筆者: 株式会社クリエ・イルミネート 溝端 二三雄

マイドキュメントのフォルダーへのパスは Windows のバージョンによって異なります。また、Active Directory のメンバー コンピュータの場合、ネットワーク共有になる場合もあります (移動ユーザー プロファイルを使用時)。このため、マイドキュメントのフォルダーにアクセスする際にパスをハードコード

するのは推奨されません。実行環境のマイドキュメントのフォルダーへのパスを取得する専用の API を使用するべきです。


今回紹介するコード

Visual Basic
Option Explicit 
Private Const S_OK = &H0                ' Success 
Private Const S_FALSE = &H1             ' The Folder is valid, but does not exist 
Private Const E_INVALIDARG = &H80070057 ' Invalid CSIDL Value 
Private Const CSIDL_PERSONAL = &H5 
Private Declare Function SHGetFolderPath Lib "shfolder" _ 
    Alias "SHGetFolderPathA" _ 
    (ByVal hwndOwner As Long, ByVal nFolder As Long, _ 
    ByVal hToken As Long, ByVal dwFlags As Long, _ 
    ByVal pszPath As String) As Long 
 
Private Sub MyDocumentButton_Click() 
    Dim sPath As StringDim RetVal As LongsPath = String(2600) 
    RetVal = SHGetFolderPath(0, CSIDL_PERSONAL, 00, sPath) 
    Select Case RetVal 
       Case S_OK 
            sPath = Left(sPath, InStr(1, sPath, Chr(0)) - 1)  
            MyDocumentLabel.Caption = sPath 
       Case S_FALSE 
            MyDocumentLabel.Caption = "フォルダが存在しません。" 
       Case E_INVALIDARG 
            MyDocumentLabel.Caption = "不正なIDが指定されました。" 
    End Select 
End Sub 
 
 


Windows API を呼び出すための準備

次の 1 行 (Declare 構文) で Windows API を使用するための宣言を行っています。具体的には shfolder.dll 内にある SHGetFolderPathA 関数を使用 (オプションである Alias を指定しているので、VB6.0 では GetVersionEx と言う関数名で使用) するための宣言となります。
Private Declare Function SHGetFolderPath Lib "shfolder" _

 

Visual Basic
    Alias "SHGetFolderPathA" _    (ByVal hwndOwner As Long, ByVal nFolder As Long, _ 
 
    ByVal hToken As Long, ByVal dwFlags As Long, _    ByVal pszPath As String) As Long 
 
 

 

 

SHGetFolderPath 関数の呼び出し

マイドキュメントのフォルダーのパスを取得するために使用する SHGetFolderPath 関数には 5 個の引数があります。pszPath にはこの関数によって取得されたパスが返ってきます。それ以外の引数は以下の値を設定します。

サンプルコードの実行

正しくフォルダーへのパスが取得できた場合、ラベルに表示するようになっているので、実行すると以下のような結果となります。

参考

nFolder で指定する 16 進の値で代表的なものを以下に記載します。各定数が何を示しているかに関しては、CSIDL (英語)  をご参照ください。


関連リンク

 


Code Recipe Windows デベロッパー センター

ページのトップへ