MFC读取配置文件GetPrivateProfileString
讀取.ini文件;
?
UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault,LPCTSTR lpFileName);
讀取整形值。
其中個(gè)參數(shù)的意思:
LPCTSTR lpAppName??????------- INI文件中的一個(gè)字段名
LPCTSTR lpKeyName ?????------- lpAppName 下的一個(gè)鍵名,也就是里面具體的變量名
LPCTSTR lpString???????------- 是鍵值,也就是變量的值, 必須為L(zhǎng)PCTSTR或CString類(lèi)型
LPCTSTR lpFileName?????------- 完整的INI文件路徑名
LPCTSTR lpDefaut???????------- 如果沒(méi)有其前兩個(gè)參數(shù)值,則將此值賦給變量
LPSTR lpReturnedString ------- 接收INI文件中的值的CString對(duì)象,即接收緩沖區(qū)
DWORD nSize????????????------- 接收緩沖區(qū)的大小
?
例子:
CString StrName,Strtemp;
int nAge;
StrName = "jacky";
nAge = 13;
WritePrivateProfileString("Student","Name",StrName,"c:\\setting.ini");
結(jié)果:(INI文件中顯示如下:)
[Student]
Name=jacky
讀取:
CString SName;
GetPrivateProfileString("Student","Name","DefaultName",SName.GetBuffer(MAX_LENGTH),MAX_LENGTH,"c:\\setting.ini");
結(jié)果:SName = "jacky";這里需要注意點(diǎn)就是用完GetBuffer函數(shù)后一定要釋放(用SName.ReleaseBuffer()函數(shù)),不然后面再用到SName的其他子函數(shù)就會(huì)失靈。
讀整數(shù)比較簡(jiǎn)單,如下
int Result =?GetPrivateProfileInt("Student","nAge",0,"c:\\setting.ini")返回值即為所讀取的結(jié)果!
在GetPrivateProfileString最后一個(gè)參數(shù)是配置文件路徑的參數(shù),此路徑只能是絕對(duì)路徑,不能是相對(duì)路徑,但現(xiàn)在我需要是我的exe文件能和我的配置文件在一起。因此我使用了GetCurrentDirectory函數(shù)。
原代碼如下:
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變量時(shí),在使用完GetBuffer后,緊接著一定要使用ReleaseBuffer()函數(shù),才可以進(jìn)行其他的諸如字符串+操作
?
更多說(shuō)明:
獲取路徑
GetCurrentDirectory只是返回當(dāng)前進(jìn)程的當(dāng)前目錄,而并不是進(jìn)程的鏡像文件(.exe)所在的目錄
GetCurrentDirectory()適用于XP等系統(tǒng),在WinCE上不能使用
GetModuleFileName()適用于WinCE2.0以后
使用方法:
//下面的一段代碼主要是獲得當(dāng)前程序的運(yùn)行目錄(.exe)所在的目錄
{
????CString path;
????GetModuleFileName(NULL,path.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
????path.ReleaseBuffer();
????int pos = path.ReverseFind('\\');
????path = path.Left(pos);
}
GetModuleFileName函數(shù)
WINAPI DWORD GetModuleFileName(
??HMODULE hModule,
??LPWSTR lpFilename,
??DWORD nSize
);
??????GetBuffer和ReleaseBuffer是一套需要配合使用的函數(shù), 與GetBufferSetLength相比, 優(yōu)點(diǎn)是如果分配的空間大于實(shí)際保存的字符串(0結(jié)尾),
ReleaseBuffer會(huì)把多余申請(qǐng)的空間釋放, 歸還給系統(tǒng); 但使用時(shí)需要注意以下問(wèn)題: 如果要保存的字符串為abc(0結(jié)尾),則GetBuffer參數(shù)應(yīng)至少
為3; 如果要保存的內(nèi)容不是以0結(jié)尾, 比如是讀取文件數(shù)據(jù), 則GetBuffer參數(shù)如果大于文件長(zhǎng)度時(shí),ReleaseBuffer參數(shù)一定要為文件長(zhǎng)度(如果
GetBuffer參數(shù)為文件長(zhǎng)度的話不存在問(wèn)題,ReleaseBuffer參數(shù)可以為默認(rèn)-1)!
?GetBufferSetLength相對(duì)比較容易理解, 它申請(qǐng)一個(gè)指定長(zhǎng)度的空間, 即使里面最終保存的字符串長(zhǎng)度小于申請(qǐng)的空間長(zhǎng)度, 也不會(huì)將多余空間釋放.
__________________________________________________________________________________________________________________DWORDGetCurrentDirectory(
??DWORD nBufferLength,
??LPTSTR lpBuffer
);The GetCurrentDirectory function retrieves the current directory for the current process.GetCurrentDirectory返回當(dāng)前進(jìn)程的當(dāng)前目錄,并不一定返回你的應(yīng)用程序的目錄。如果你在應(yīng)用程序中調(diào)用了打開(kāi)文件對(duì)話框,你選擇了一個(gè)文件,那么,這個(gè)文件所在的目錄就成了當(dāng)前進(jìn)程的當(dāng)前目錄了。Parameters
nBufferLength: 接收保存路徑的字符串緩存長(zhǎng)度, 緩存必須有一個(gè)保存結(jié)束的空字符的位置.
lpBuffer:指向接收字符串的緩存,收到的非空字符串指定了當(dāng)前目錄的絕對(duì)路徑.
DWORD GetModuleFileName(
??HMODULE hModule,
??LPTSTR lpFilename,
??DWORD nSize
);
GetModuleFileName 函數(shù)指定當(dāng)前進(jìn)程模塊的路徑.它僅僅操作當(dāng)前進(jìn)程下的模塊.如果想獲取其他進(jìn)程下的模塊信息, 則需使用 GetModuleFileNameEx 函數(shù).Parameters
hModule:模塊的句柄,或者設(shè)置為NULL表示當(dāng)前模塊。
lpFilename:保存路徑的緩沖區(qū)。
nSize:緩沖區(qū)的大小。
例子: TCHAR strExePath[_MAX_PATH];
?GetModuleFileName(NULL,strExePath,_MAX_PATH); PathRemoveFileSpec(strExePath);如果當(dāng)前執(zhí)行程序的位置為c:\test.exe,GetModuleFileName獲取的strExePath即為c:\test.ext,通過(guò)去掉名稱(chēng)函數(shù)最終獲得的strExePath為c:。(注意PathRemoveFileSpec?系統(tǒng)API函數(shù)調(diào)用時(shí)必須包含#include??"Shlwapi.h"作為頭文件) TCHAR strExePath[_MAX_PATH];
?GetCurrentDirectory(_MAX_PATH, strExePath); 獲取當(dāng)前的系統(tǒng)目錄,可能是c:也可能是其他值。
?
------------------------------------------------------------------------------------------------------
shlwapi.dll
shlwapi - shlwapi.dll - DLL文件信息
DLL 文件: shlwapi 或者 shlwapi.dll
DLL 名稱(chēng): Microsoft Shell Light-weight Utility Library
描述: shlwapi.dll是UNC和URL地址動(dòng)態(tài)鏈接庫(kù)文件,用于注冊(cè)鍵值和色彩設(shè)置。
屬于: Microsoft Windows Shell
系統(tǒng) DLL文件: 是
常見(jiàn)錯(cuò)誤: File Not Found, Missing File, Exception Errors
安全等級(jí) (0-5): 0 間諜軟件: 否 廣告軟件: 否
VC中使用GetModuleFileName獲取應(yīng)用程序路徑
.\\與API函數(shù)GetModuleFileName獲取應(yīng)用程序目錄有何不一樣?
采用.\\也能獲得應(yīng)用程序目錄,采用GetModuleFileName也能獲得,二者有何不同?
一樣!
一個(gè)是相對(duì)路徑,一個(gè)是絕對(duì)路徑
.\\是得到應(yīng)用程序的當(dāng)前目錄,但當(dāng)前目錄不一定等于應(yīng)用程序執(zhí)行文件的所在目錄,一個(gè)應(yīng)用程序被啟動(dòng)時(shí),當(dāng)前目錄是可以被任意設(shè)置的。
GetModuleFileName()得到模塊的完整路徑名,例如,你載入c:\windows\system32\a.dll,得到模塊句柄h,則你可以用GetModuleFileName()得到h模塊的完整路徑名。
.\\一般用在包含頭文件的語(yǔ)句中。
另一個(gè)是程序編譯后起作用的,例如,打開(kāi)自定義的配置文件等。
如何去取得這個(gè)Hanlde?
如果你直接用LoadLibrary()或AfxLoadLibrary()載入dll,該函數(shù)返回值就是handle;
如果你隱式載入dll, 用GetModuleHandle("dll文件名")也可以得到handle;
MFC程序得到本身路徑
在開(kāi)發(fā)工程中,往往需要知道當(dāng)前程序本身所在目錄。
一種方法是在程序安裝的時(shí)候利用安裝程序把文件路徑寫(xiě)入注冊(cè)表。在較大的程序中,這種方法比較常用
另一種,就是在程序得到路徑。這樣,程序隨便移動(dòng)到哪里,都可以得到正確的路徑。這也是本文介紹的方法。
?
方法一:
[code]
//得到幫助文件的路徑
CString strFullName =?AfxGetApp()->m_pszHelpFilePath;
//得到的是:X:\XXXX\XXX.hlp
//解析路徑,得到當(dāng)前運(yùn)行程序所在目錄
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
_splitpath(strAppName, drive, dir, NULL,NULL);
CString strPath;
strPath.Format("%s%s", drive, dir);
//strPath即為得到的當(dāng)前運(yùn)行程序所在目錄
[/code]
另外,AfxGetApp()->m_pszAppName?得到應(yīng)用程序名稱(chēng)
AfxGetApp()->m_pszExeName?得到程序文件名,不包括擴(kuò)展名
?
方法二:
得到全路徑
TCHAR exeFullPath[MAX_PATH]; // MAX_PATH
GetModuleFileName(NULL,exeFullPath,MAX_PATH);//得到程序模塊名稱(chēng),全路徑
也就是當(dāng)前運(yùn)行程序的全路徑
利用方法一的解析路徑的方法,即可得到程序所在路徑。
GetModuleFileName函數(shù)原型
DWORD GetModuleFileName(
???HMODULE hModule,?????// handle to module。將要得到的模塊的句柄。如果是當(dāng)前模塊,NULL
???LPTSTR lpFilename,???// path buffer???得到的文件名。
???DWORD nSize)??????????// size of buffer???一般MAX_PATH就可以了
總結(jié)
以上是生活随笔為你收集整理的MFC读取配置文件GetPrivateProfileString的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 天刀服务器未响应,天涯明月刀卡顿怎么办
- 下一篇: Redis 未授权访问 CNNVD-20