32328


お世話になっております。  
iniファイルの読み込みのprogramを作っているのですが、読み込み時に  
「保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。」と言われます。  
AccessViolationExceptionです。

コードは

[code]

            [DllImport("kernel32.dll")]
            static extern string GetPrivateProfileString(
               string lpAppName,
               string lpKeyName,
               string lpDefault,
               string lpFileName);
    
    string name =  GetPrivateProfileString(sectionName, "00", "", iniFilePath + @"\" + inifileName);
    
[/code]

inifileは見る事も出来ますし、壊れている可能性はないと思うのですが…。  
filePathなどが間違っているのかと思ったのですが、エクスプローラーで問題なく表示されます。  
原因としては他に何が考えられるのでしょうか？  
iniファイルを使った処理が初めてなので、初歩的な質問ですがよろしくお願いします。

inifileの内容  
[セッションA]  
00= 10000  
01=0  
02=ｽｽﾞｷ  
03=鈴木  
04=1  
05=2  
06=261117

.net3.5  
C#  
windows8.1


CC BY-SA 3.0
2017-02-02T05:21:02.283
32325
2017-02-02T05:49:24.587
19310
question
c#
iniファイル読み込みについて


Win32APIから文字列を受け取る場合、一般的には呼び出し元で結果が書き込まれるバッファを用意してから呼び出します。問題の`GetPrivateProfileString`も

[code]

    DWORD GetPrivateProfileString(
      LPCTSTR lpAppName,        // セクション名
      LPCTSTR lpKeyName,        // キー名
      LPCTSTR lpDefault,        // 既定の文字列
      LPTSTR lpReturnedString,  // 情報が格納されるバッファ
      DWORD nSize,              // 情報バッファのサイズ
      LPCTSTR lpFileName        // .ini ファイルの名前
    );
    
[/code]

と4番目の引数でバッファを、5番目でバッファの長さを指定する仕様です。

このような関数をC#から呼び出す際には`StringBuilder`を使用して、

[code]

    var sb = new StringBuilder(16); // バッファの長さ
    GetPrivateProfileString(
        sectionName,
        "00",
        "",
        sb,
        sb.Capacity,
        iniFilePath + @"\" + inifileName);
    var name = sb.ToString();
    
[/code]

と事前に作成したインスタンスに書き込みを行わせます。  
P/Invokeの定義は`DWORD`を`int`、`LPCTSTR`を`string`に置き換えればよいので

[code]

    [DllImport("kernel32.dll")]
    static extern uint GetPrivateProfileString(
        string lpAppName,
        string lpKeyName,
        string lpDefault,
        StringBuilder lpReturnedString,
        int nSize,
        string lpFileName);
    
[/code]

となります。

ちなみに`iniFilePath + @"\" + inifileName`は`Path.Combine(iniFilePath,
inifileName)`とした方が良いです。


CC BY-SA 3.0
2017-02-02T05:49:24.587
32328
2017-02-02T05:49:24.587
5750
32325
answer