2013-07-04 109 views
2

我想用GetPrivateProfileString製作一個INI閱讀器。我使用的是什麼:GetPrivateProfileString not working .NET

public class Config 
{ 
    [DllImport("kernel32")] 
    private static extern int GetPrivateProfileString(string Section, string Key, string Default, StringBuilder RetVal, int Size, string FilePath); 

    private string path; 

    public Config(string path) 
    { 
     this.path = path; 
    } 

    public string PopValue(string section, string key) 
    { 
     StringBuilder sb = new StringBuilder(); 
     GetPrivateProfileString(section, key, "", sb, sb.Length, path); 
     return sb.ToString(); 
    } 
} 

現在我的INI文件:

[mysql] 
host=localhost 

我用什麼:

Console.WriteLine(Configuration.PopValue("mysql", "host")); 

然而,它只是打印出一個空行,而不是localhost。我究竟做錯了什麼?

+1

**從不**使用GetPrivateProfileString(),由於它的appcompat行爲,它非常昂貴。讀取一個* single * ini參數的成本爲50毫秒。閱讀其中的20個,你已經吹了你的啓動時間。格式很簡單,很容易用StreamReader解析自己。 –

回答

1

如果您可以使用第三方庫,請嘗試使用Nini。 我使用它,很容易創建/管理複雜的INI文件,並且是開源的。

GetPrivateProfileString簽名是

DWORD WINAPI GetPrivateProfileString(
    _In_ LPCTSTR lpAppName, 
    _In_ LPCTSTR lpKeyName, 
    _In_ LPCTSTR lpDefault, 
    _Out_ LPTSTR lpReturnedString, 
    _In_ DWORD nSize, 
    _In_ LPCTSTR lpFileName 
); 

所以不出來是StringBuilder使用String

+0

妮妮工作正常,我想我只會使用妮妮,這很容易:)謝謝。 – user2528595

+0

您也可以使用'StringBuilder'作爲'out'參數 – Jack

5

是的,如果你喜歡,你可以使用StringBuilder這裏是解決方案:

[DllImport("kernel32")] 
private static extern int GetPrivateProfileString(string Section, string Key, string Default, StringBuilder RetVal, int Size, string FilePath); 

public string PopValue(string section, string key) 
{ 
    StringBuilder sb = new StringBuilder(4096); 
    int n = GetPrivateProfileString(section, key, "", sb, 4096, path); 
    if(n<1) return string.Empty; 
    return sb.ToString(); 
} 

問題是當你傳入sb.Length時你傳遞了一個零長度,並且它被導入的函數解釋爲re是沒有空格來寫回報值 - 所以它什麼都沒寫。

+0

'path'定義在哪裏?被列爲'GetPrivateProfileString()'的最後一個參數的那個? –