讀取.ini文件;
?
UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault,LPCTSTR lpFileName);
讀取整形值。
其中個參數的意思:
LPCTSTR lpAppName?
LPCTSTR lpKeyName ?
LPCTSTR lpString?
LPCTSTR lpFileName?
LPCTSTR lpDefaut?
LPSTR lpReturnedString ------- 接收INI文件中的值的CString對象,即接收緩沖區
DWORD nSize?
?
例子:
CString StrName,Strtemp;
int nAge;
StrName = "jacky";
nAge = 13;
WritePrivateProfileStrin
結果:(INI文件中顯示如下:)
[Student]
Name=jacky
讀取:
CString SName;
GetPrivateProfileString("Student","Name","DefaultName",SName.GetBuffer(MAX_LENGTH),MAX_LENGTH,"c:\\setting.ini");
結果:SName = "jacky";這里需要注意點就是用完GetBuffer函數后一定要釋放(用SName.ReleaseBuffer()函數),不然后面再用到SName的其他子函數就會失靈。
讀整數比較簡單,如下
int Result =?GetPrivateProfileInt("Student","nAge",0,"c:\\setting.ini")返回值即為所讀取的結果!
在GetPrivateProfileString最后一個參數是配置文件路徑的參數,此路徑只能是絕對路徑,不能是相對路徑,但現在我需要是我的exe文件能和我的配置文件在一起。因此我使用了GetCurrentDirectory函數。
原代碼如下:
CString server_ip;
CString des="";
::GetCurrentDirectory(MAX_PATHLENGTH,des.GetBuffer(MAX_PATHLENGTH));
des.ReleaseBuffer();
des+="\\config.ini";
GetPrivateProfileString("PhoneDemo","Server_IP","",server_ip.GetBufferSetLength(15),15,des);
server_ip.ReleaseBuffer();
注意:在這里使用CString變量時,在使用完GetBuffer后,緊接著一定要使用ReleaseBuffer()函數,才可以進行其他的諸如字符串+操作
?
更多說明:
獲取路徑
GetCurrentDirectory只是返回當前進程的當前目錄,而并不是進程的鏡像文件(.exe)所在的目錄
GetCurrentDirectory()適用于XP等系統,在WinCE上不能使用
GetModuleFileName()適用于WinCE2.0以后
使用方法:
//下面的一段代碼主要是獲得當前程序的運行目錄(.exe)所在的目錄
{
?
?
?
?
?
}
GetModuleFileName函數
WINAPI DWORD GetModuleFileName(
?
?
?
);
?
ReleaseBuffer會把多余申請的空間釋放, 歸還給系統; 但使用時需要注意以下問題: 如果要保存的字符串為abc(0結尾),則GetBuffer參數應至少
為3; 如果要保存的內容不是以0結尾, 比如是讀取文件數據, 則GetBuffer參數如果大于文件長度時,ReleaseBuffer參數一定要為文件長度(如果
GetBuffer參數為文件長度的話不存在問題,ReleaseBuffer參數可以為默認-1)!
?
__________________________________________________________________________________________________________________DWORDGetCurrentDirectory(
?
?
);The GetCurrentDirectory function retrieves the current directory for the current process.GetCurrentDirectory返回當前進程的當前目錄,并不一定返回你的應用程序的目錄。如果你在應用程序中調用了打開文件對話框,你選擇了一個文件,那么,這個文件所在的目錄就成了當前進程的當前目錄了。Parameters
nBufferLength: 接收保存路徑的字符串緩存長度, 緩存必須有一個保存結束的空字符的位置.
lpBuffer:指向接收字符串的緩存,收到的非空字符串指定了當前目錄的絕對路徑.
DWORD GetModuleFileName(
?
?
?
);
GetModuleFileName 函數指定當前進程模塊的路徑.它僅僅操作當前進程下的模塊.如果想獲取其他進程下的模塊信息, 則需使用 GetModuleFileNameEx 函數.Parameters
hModule:模塊的句柄,或者設置為NULL表示當前模塊。
lpFilename:保存路徑的緩沖區。
nSize:緩沖區的大小。
例子: TCHAR strExePath[_MAX_PATH];
?
?
?
------------------------------------------------------------------------------------------------------
shlwapi.dll
shlwapi - shlwapi.dll - DLL文件信息
DLL 文件: shlwapi 或者 shlwapi.dll
DLL 名稱: Microsoft Shell Light-weight Utility Library
描述: shlwapi.dll是UNC和URL地址動態鏈接庫文件,用于注冊鍵值和色彩設置。
屬于: Microsoft Windows Shell
系統 DLL文件: 是
常見錯誤: File Not Found, Missing File, Exception Errors
安全等級 (0-5): 0 間諜軟件: 否 廣告軟件: 否
VC中使用GetModuleFileName獲取應用程序路徑
.\\與API函數GetModuleFileName獲取應用程序目錄有何不一樣?
采用.\\也能獲得應用程序目錄,采用GetModuleFileName也能獲得,二者有何不同?
一樣!
一個是相對路徑,一個是絕對路徑
.\\是得到應用程序的當前目錄,但當前目錄不一定等于應用程序執行文件的所在目錄,一個應用程序被啟動時,當前目錄是可以被任意設置的。
GetModuleFileName()得到模塊的完整路徑名,例如,你載入c:\windows\system32\a.dll,得到模塊句柄h,則你可以用GetModuleFileName()得到h模塊的完整路徑名。
.\\一般用在包含頭文件的語句中。
另一個是程序編譯后起作用的,例如,打開自定義的配置文件等。
如何去取得這個Hanlde?
如果你直接用LoadLibrary()或AfxLoadLibrary()載入dll,該函數返回值就是handle;
如果你隱式載入dll, 用GetModuleHandle("dll文件名")也可以得到handle;
MFC程序得到本身路徑
在開發工程中,往往需要知道當前程序本身所在目錄。
一種方法是在程序安裝的時候利用安裝程序把文件路徑寫入注冊表。在較大的程序中,這種方法比較常用
另一種,就是在程序得到路徑。這樣,程序隨便移動到哪里,都可以得到正確的路徑。這也是本文介紹的方法。
?
方法一:
[code]
//得到幫助文件的路徑
CString strFullName =?AfxGetApp()->m_pszHelpFilePath;
//得到的是:X:\XXXX\XXX.hlp
//解析路徑,得到當前運行程序所在目錄
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
_splitpath(strAppName, drive, dir, NULL,NULL);
CString strPath;
strPath.Format("%s%s", drive, dir);
//strPath即為得到的當前運行程序所在目錄
[/code]
另外,AfxGetApp()->m_pszAppName?得到應用程序名稱
AfxGetApp()->m_pszExeName?得到程序文件名,不包括擴展名
?
方法二:
得到全路徑
TCHAR exeFullPath[MAX_PATH]; // MAX_PATH
GetModuleFileName(NULL,exeFullPath,MAX_PATH);//得到程序模塊名稱,全路徑
也就是當前運行程序的全路徑
利用方法一的解析路徑的方法,即可得到程序所在路徑。
GetModuleFileName函數原型
DWORD GetModuleFileName(
?
?
?