首先,介紹一下kernel32.dll。
kernel32.dll是Windows9x/Me中非常重要的32位動態鏈接庫文件,屬於內核級文件。
它控制著系統的內存管理、數據的輸入輸出操作和中斷處理。
當Windows啟動時,kernel32.dll就駐留在內存中特定的寫保護區域,使別的程序無法占用這個內存區域。
接下來看一下GetPrivateProfileString和WritePrivateProfileString兩個函數的原型。
DWORD GetPrivateProfileString(
LPCTSTR lpAppName, // section name
LPCTSTR lpKeyName, // key name
LPCTSTR lpDefault, // default string
LPTSTR lpReturnedString, // destination buffer
DWORD nSize, // size of destination buffer
LPCTSTR lpFileName // initialization file name
);
參數說明:
lpAppName
[in] 指針指向一個空終止字符串,指定包含密鑰名節的名稱。如果該參數為NULL,GetPrivateProfileString功能將文件復制到提供的緩沖區中的所有部分的名稱。
lpKeyName
[in] 指向空終止字符串,指定其關聯的字符串鍵的名稱將被檢索。如果這個參數為NULL,由AppName的參數指定的部分的所有鍵名被復制到由返回的字符串參數指定的緩沖區。
lpDefault
[in] 指針指向一個空結束的默認字符串。如果lpKeyName密鑰不能在初始化文件中找到,GetPrivateProfileString副本的缺省字符串到lpReturnedString緩沖器。此參數不能為NULL。
lpReturnedString
[out] 指向接收所檢索的字符串的緩沖區。
nSize
[in] 指定的大小,以返回tchars,緩沖所指向lpReturnedString參數。
lpFileName
[in] 指針指向一個空終止字符串,指定初始化文件的名稱。如果該參數不包含文件的完整路徑,系統搜索在Windows目錄中的文件。
返回值:
返回值是復制到緩沖區,不包括終止空字符的字符數。
***************************************************************************************************************************************
CSDN中對幾個類型的解釋:
DWORD: A 32-bit unsigned integer or the address of a segment and its associated offset.
LPCTSTR:A 32-bit pointer to a constant character string that is portable for Unicode and DBCS.
LPTSTR :A 32-bit pointer to a character string that is portable for Unicode and DBCS.
LPCSTR: A 32-bit pointer to a constant character string.
LPSTR : A 32-bit pointer to a character string.
其中:
L: 表示long指針。
P: 表示這是一個指針。
T: 表示_T宏,這個宏用來表示你的字符是否使用UNICODE, 如果你的程序定義了UNICODE或者其他相關的宏,那麼這個字符或者字符串將被作為UNICODE字符串,否則就是標准的ANSI字符串。
STR:表示這個變量是一個字符串。
C: 表示是一個常量,const。
***************************************************************************************************************************************
C#導入DLL類型對應關系如下:
c++:WORD ---- c#:ushort
c++:DWORD ---- c#:uint
c++:DWORD ---- c#:int
c++:LPCTSTR ---- c#:StringBuilder
c++:LPCTSTR ---- c#:string
c++:LPCSTR(const char*) ---- c#:System.String
c++:LPTSTR 輸出變量名 ---- c#:StringBuilder 輸出變量名
所以在C#導入GetPrivateProfileString函數時,由int代替DWORD;由string代替LPCTSTR;由StringBuilder輸出變量代替LPTSTR輸出變量。
得出:
DWORD GetPrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName,LPCTSTR lpDefault, LPTSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName);
變為:
public static extern int GetPrivateProfileString(string section, string key, string def, System.Text.StringBuilder retVal, int size, string filePath);
*******************************************************************************************************************************************
最終使用:
[System.Runtime.InteropServices.DllImport(kernel32)]
public static extern int GetPrivateProfileString(string section, string key, string def, System.Text.StringBuilder retVal, int size, string filePath);
public int ReadIni()
{
string str = D:\123.ini;
StringBuilder temp = new StringBuilder();
GetPrivateProfileString(ScreenOrder, LoginWindow, 1, temp, 255, str);
string str1 = temp.ToString();
int i = int.Parse(str1);
return i;
}
*******************************************************************************************************************************************
以上闡述了C#如何讀取.ini文件,對於C#寫入配置文件則非常相似,便不再贅述。
原型:
BOOL WritePrivateProfileString(
LPCTSTR lpAppName, // section name
LPCTSTR lpKeyName, // key name
LPCTSTR lpString, // string to add
LPCTSTR lpFileName // initialization file
);
根據以上闡述的C#導入C++ DLL的類型轉換可以得到C#中函數如下:
[System.Runtime.InteropServices.DllImport(kernel32)]
public static extern int WritePrivateProfileString(string Section, string Key, string Value, string iniFilePath);