質問: GetPrivateProfileString(sectionName, "00", "", iniFilePath + @"\" + inifileName); ``` inifileは見る事も出来ますし、壊れている可能性はないと思うのですが...。 filePathなどが間違っているのかと思ったのですが、エクスプローラーで問題なく表示されます。 原因としては他に何が考えられるのでしょうか? iniファイルを使った処理が初めてなので、初歩的な質問ですがよろしくお願いします。 inifileの内容 [セッションA] 00= 10000 01=0 02=スズキ 03=鈴木 04=1 05=2 06=261117 .net3.5 C# windows8.1
回答: Win32APIから文字列を受け取る場合、一般的には呼び出し元で結果が書き込まれるバッファを用意してから呼び出します。問題の`GetPrivateProfileString`も ``` DWORD GetPrivateProfileString( LPCTSTR lpAppName, // セクション名 LPCTSTR lpKeyName, // キー名 LPCTSTR lpDefault, // 既定の文字列 LPTSTR lpReturnedString, // 情報が格納されるバッファ DWORD nSize, // 情報バッファのサイズ LPCTSTR lpFileName // .ini ファイルの名前 ); ``` と4番目の引数でバッファを、5番目でバッファの長さを指定する仕様です。 このような関数をC#から呼び出す際には`StringBuilder`を使用して、 ``` var sb = new StringBuilder(16); // バッファの長さ GetPrivateProfileString( sectionName, "00", "", sb, sb.Capacity, iniFilePath + @"\" + inifileName); var name = sb.ToString(); ``` と事前に作成したインスタンスに書き込みを行わせます。 P/Invokeの定義は`DWORD`を`int`、`LPCTSTR`を`string`に置き換えればよいので ``` [DllImport("kernel32.dll")] static extern uint GetPrivateProfileString( string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName); ``` となります。 ちなみに`iniFilePath + @"\" + inifileName`は`Path.Combine(iniFilePath, inifileName)`とした方が良いです。