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

Windows システム フォルダー (Windows 7 の場合、既定では C:\Windows\System32) には、パフォーマンス モニター (Perfmon.exe) のような管理ツールやユーザーアカウント制御の設定 (UserAccountControlSettings.exe) のような標準の設定ツールなどのツール類や Windows API の DLL などが保存されています。また、システム フォルダー内のサブ フォルダーである drivers\etc にはコンピュータ名 (ホスト名) と IP アドレスを解決するための Hosts ファイルや LMHOSTS ファイルがあります。このように、システム フォルダーやそのサブフォルダーには参照しないといけなくなる可能性のあるファイルが多く含まれていますが、パスをハードコードするのは推奨されません。実行環境のマイドキュメントのフォルダーへのパスを取得する専用の API を使用するべきです。なぜなら、Windows のバージョンや Windows をインストールする際にパスを変更できるため、実行環境によっては動作しないプログラムになるからです。

この問題を解決するための API が Windows には存在します。ここでは Visual Basic 6.0 から Windows 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_SYSTEM = &H25 
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 SystemButton_Click() 
    Dim sPath As StringDim RetVal As LongsPath = String(2600) 
    RetVal = SHGetFolderPath(0, CSIDL_SYSTEM, 00, sPath) 
    Select Case RetVal 
       Case S_OK 
            sPath = Left(sPath, InStr(1, sPath, Chr(0)) - 1)  
            SystemLabel.Caption = sPath 
       Case S_FALSE 
            SystemLabel.Caption = "フォルダが存在しません。" 
       Case E_INVALIDARG 
            SystemLabel.Caption = "不正な ID が指定されました。" 
    End Select 
End Sub 
 
 


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

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

Visual Basic
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 
 
 

 

 

SHGetFolderPath 関数の呼び出し

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

サンプルコードの実行

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

参考

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


関連リンク


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

ページのトップへ