あんにんにっき。

日々思ったことや、おこったことを記録するブログ。要するに日記。

.NET Compact Frameworkで、プログラムの動いているフォルダを取得してみる。

 設定ファイルを読み込んで動作を変更、って感じの動作の実験を試みようとしたのだが、WindowsMobileにはカレントディレクトリってのが無いらしく、.Netの標準のAPIではプログラムの動いているフォルダを取得できる方法が見あたらなかった。
 で、DLLを直接呼び出してみる事を試してみることにした。なお、試した言語は、VB2005の方。C#でもいいのだけど、VBの方が慣れているってのがあるので。
 まず、DLLImportする。

    <Runtime.InteropServices.DllImport("coredll")> _
    Private Shared Function GetModuleFileName( _
        ByVal hModule As IntPtr, _
        ByVal lpFileName As Char(), _
        ByVal nSize As UInt16) As UInt16
    End Function

 これで、coredllに定義されている、GetModuleFileNameが呼び出せるようになる。あとは、適切な引数を渡して呼び出してやるだけ。

        '自分自身のフォルダを確認する
        Dim path(64) As Char
        GetModuleFileName(Nothing, path, 8 * 64)
        Dim fullpath As New System.Text.StringBuilder()
        For Each c As Char In path
            If c = Nothing Then Exit For
            fullpath.Append(c)
        Next

 一つめの引数がNothingなのは、NULLを指定してこの関数を呼び出すと、現在のプロセスを作成するために使われたファイルのパスを取得しますって事らしいので。
 二つめの引数は、結果を格納してもらうための領域。三つ目がそのサイズ。ちなみにサイズを8 * 64 としたのは、VBでのsizeofに相当する物が分からなかったので、暫定的って事で。
 これでfullpath.toString()で現在のプログラムのフルパスが取得できた。
 ちなみに、VS.NETから起動したときは、\Program Filesの下にプロジェクト名と同じフォルダができて、そこに配置されていた。