bool WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR lpFileName);
讀取.ini文件;
UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault,LPCTSTR lpFileName);
讀取整形值。
其中個參數的意思:
LPCTSTR lpAppName ------- INI文件中的一個字段名
LPCTSTR lpKeyName ------- lpAppName 下的一個鍵名,也就是里面具體的變量名
LPCTSTR lpString ------- 是鍵值,也就是變量的值, 必須為LPCTSTR或CString類型
LPCTSTR lpFileName ------- 完整的INI文件路徑名
LPCTSTR lpDefaut ------- 如果沒有其前兩個參數值,則將此值賦給變量
LPSTR lpReturnedString ------- 接收INI文件中的值的CString對象,即接收緩沖區
DWORD nSize ------- 接收緩沖區的大小
例子:
CString StrName,Strtemp;
int nAge;
StrName = "jacky";
nAge = 13;
WritePrivateProfileString("Student","Name",StrName,"c:\\setting.ini");
結果:(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)所在的目錄
{
CString path;
GetModuleFileName(NULL,path.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
path.ReleaseBuffer();
int pos = path.ReverseFind('\\');
path = path.Left(pos);
}
GetModuleFileName函數
WINAPI DWORD GetModuleFileName(
HMODULE hModule,
LPWSTR lpFilename,
DWORD nSize
);
GetBuffer和ReleaseBuffer是一套需要配合使用的函數, 與GetBufferSetLength相比, 優點是如果分配的空間大於實際保存的字符串(0結尾),
ReleaseBuffer會把多余申請的空間釋放, 歸還給系統; 但使用時需要注意以下問題: 如果要保存的字符串為abc(0結尾),則GetBuffer參數應至少
為3; 如果要保存的內容不是以0結尾, 比如是讀取文件數據, 則GetBuffer參數如果大於文件長度時,ReleaseBuffer參數一定要為文件長度(如果
GetBuffer參數為文件長度的話不存在問題,ReleaseBuffer參數可以為默認-1)!
GetBufferSetLength相對比較容易理解, 它申請一個指定長度的空間, 即使里面最終保存的字符串長度小於申請的空間長度, 也不會將多余空間釋放.
__________________________________________________________________________________________________________________DWORDGetCurrentDirectory(
DWORD nBufferLength,
LPTSTR lpBuffer
);The GetCurrentDirectory function retrieves the current directory for the current process.GetCurrentDirectory返回當前進程的當前目錄,並不一定返回你的應用程序的目錄。如果你在應用程序中調用了打開文件對話框,你選擇了一個文件,那么,這個文件所在的目錄就成了當前進程的當前目錄了。Parameters
nBufferLength: 接收保存路徑的字符串緩存長度, 緩存必須有一個保存結束的空字符的位置.
lpBuffer:指向接收字符串的緩存,收到的非空字符串指定了當前目錄的絕對路徑.
DWORD GetModuleFileName(
HMODULE hModule,
LPTSTR lpFilename,
DWORD nSize
);
GetModuleFileName 函數指定當前進程模塊的路徑.它僅僅操作當前進程下的模塊.如果想獲取其他進程下的模塊信息, 則需使用 GetModuleFileNameEx 函數.Parameters
hModule:模塊的句柄,或者設置為NULL表示當前模塊。
lpFilename:保存路徑的緩沖區。
nSize:緩沖區的大小。
例子: TCHAR strExePath[_MAX_PATH];
GetModuleFileName(NULL,strExePath,_MAX_PATH); PathRemoveFileSpec(strExePath);如果當前執行程序的位置為c:\test.exe,GetModuleFileName獲取的strExePath即為c:\test.ext,通過去掉名稱函數最終獲得的strExePath為c:。(注意PathRemoveFileSpec 系統API函數調用時必須包含#include "Shlwapi.h"作為頭文件) TCHAR strExePath[_MAX_PATH];
GetCurrentDirectory(_MAX_PATH, strExePath); 獲取當前的系統目錄,可能是c:也可能是其他值。
------------------------------------------------------------------------------------------------------
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(
HMODULE hModule, // handle to module。將要得到的模塊的句柄。如果是當前模塊,NULL
LPTSTR lpFilename, // path buffer 得到的文件名。
DWORD nSize) // size of buffer 一般MAX_PATH就可以了