● コマンドライン文字列からファイルパスのふるい分けをする ●

VB のコマンドラインの扱いはめんどくしゃぁ〜。

実行ファイルにファイルがドラッグされると、コマンドラインが文字列で送られてくる。C言語では、

  int main(int argc, char **argv)

main関数で argc にはコマンドラインの数、 **argv にはコマンドライン文字列の配列、という形でそれぞれ取得できる。一方、VBでは Command$ 関数でコマンドラインを取得することができる。C言語と違って1つの文字列として取得する。2つ以上の文字列はスペースで区切られている。ちなみに、ファイルのパスは短い形式で送られてくる。"My Document" などという既にスペースが含まれているファイル・フォルダを考慮してのことかな?

で、以下の関数では、送られてくるコマンドラインがファイルのフルパスのみであるということを前提として作ったものである。モデルはもちろん、C言語。それでは、はっけよいのこった。

'---------------------------------------------------------------------
' 関数名 : ShuffleComLine
' 引  数 : (in) CommandLimeStr … コマンドライン文字列
'          (in/out) ComLineStr() … ふるいわけされたパスが格納される配列
' 戻り値 : ふるいわけされたファイルのフルパスの数、
'             ファイルパスでなければ-1が返る
'---------------------------------------------------------------------
Private Function ShuffleComLine(ByVal CommandLineStr As String, ByRef ComLineStr() As String) As Integer

    Dim SpacePos As Long
    Dim SearchStartPos As Long
    Dim PathNum As Integer
    Dim i As Integer

    '\マークが無いなら関数終了
    If InStr(1, CommandLineStr, "\") = 0 Then
        ShuffleComLine = -1
        Exit Function
    End If

    SpacePos = InStr(1, CommandLineStr, Space$(1))

    'SpacePos=0ならパスは1つだけ
    If SpacePos = 0 Then
        ReDim Preserve ComLineStr(0) As String
        ComLineStr(0) = CommandLineStr
        ShuffleComLine = 1
        Exit Function
    End If

    '初期化--------------------------------
    SearchStartPos = 1  '検索開始位置
    SpacePos = -1      '再利用
    PathNum = 0
    '--------------------------------------

    '取得したパスの数を調べる
    While SpacePos <> 0
        SpacePos = InStr(SearchStartPos, CommandLineStr, Space$(1))
        SearchStartPos = SpacePos + 1
        PathNum = PathNum + 1  '取得したパスの数を加算
    Wend

    '配列再初期化
    ReDim Preserve ComLineStr(PathNum - 1)  As String

    '初期化--------------------------------
    SearchStartPos = 1    '検索開始位置
    SpacePos = -1      '再利用
    '--------------------------------------

    'スペース一文字分を追加する
    CommandLineStr = CommandLineStr & Space$(1)

    For i = 0 To PathNum - 1
        SpacePos = InStr(SearchStartPos, CommandLineStr, Space$(1))
        ComLineStr(i) = Mid$(CommandLineStr, SearchStartPos, SpacePos - SearchStartPos)
        SearchStartPos = SpacePos + 1
    Next i

    ShuffleComLine = PathNum

End Function

ついでなんで使用例を載っけておく。なんて親切なんだろう。

Private Sub Form_Load()

    Dim CommandLine As String
    Dim ComLineStr() As String
    Dim GetPathNum As Integer
    Dim i As Integer
    Dim ShuffledPath As String

    CommandLine = Command$

    GetPathNum = ShuffleComLine(CommandLine, ComLineStr())

    For i = 0 To GetPathNum - 1
        ShuffledPath = ShuffledPath & ComLineStr(i)
        If i <> GetPathNum - 1 Then
            ShuffledPath = ShuffledPath & vbCrLf
        End If
    Next i

    MsgBox ShuffledPath

End Sub

上のコードをコンパイルして、出来上がる実行ファイルにファイルをD&Dしてね。ちなみに、コマンドラインに渡される文字数には制限があり、ある程度までいったらエラーになる。詳細は不明ゆえ、それは自分で調べてエラー処理を組み込んでください。


戻る