MFC讀取配置文件GetPrivateProfileString

VC++中 3 個主要 寫入/讀取配置文件ini的函數
bool WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR lpFileName);
寫入.ini文件;
DWORD?GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefaut,LPSTR lpReturnedString,DWORD nSize,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
);

??????GetBufferReleaseBuffer是一套需要配合使用的函數, 與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就可以了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458578.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458578.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458578.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UESTC 250 windy數 數位dp

題目鏈接 1 #include<bits/stdc.h>2 using namespace std;3 #define mem1(a) memset(a, -1, sizeof(a))4 #define ll long long5 int dp[20][20], digit[20], len;6 ll dfs(int len, int pre, bool fp, bool first) { //first表示前面的數是否全部為0&#xff0c; pr…

c語言面試題大全

C語言面試題大匯總 4. static有什么用途&#xff1f;&#xff08;請至少說明兩種&#xff09; 1.限制變量的作用域(DL:使其只在定義的當前文件中起作用&#xff0c;static是只能由與變量在同一個文件中定義的程序存取的全局變量。也就是說使全局變量成為文件的私有變量&#…

WindowsAPI詳解——GetCurrentDirectory 獲得程序當前目錄

每個Windows程序都有一個自己的當前目錄&#xff0c;默認是程序exe文件所在的目錄。系統在給程序加載動態鏈接庫文件(DLL)時先在程序當前目錄里查找要加載的DLL&#xff0c;如果在此目錄下沒有找到系統便會去Windows目錄下查找。在這兒我們主要將如何獲得程序的當前目錄&#x…

20151210小問題2

1、各瀏覽器下 scrollTop的差異 IE6/7/8&#xff1a; 對于沒有doctype聲明的頁面里可以使用 document.body.scrollTop 來獲取 scrollTop高度 &#xff1b; 對于有doctype聲明的頁面則可以使用 document.documentElement.scrollTop&#xff1b; Safari: safari 比較特別&#x…

限制MySQL Binlog的傳輸速率

最近一臺核心庫備庫完成恢復后打開slave&#xff0c;導致主庫傳送binlog&#xff0c;瞬間占滿網絡&#xff0c;觸發故障。 為了做一些限制&#xff0c; 給mysql在發送binlog的函數(mysql_binlog_send)里每隔一段時間sleep一次&#xff0c; 增加了兩個參數&#xff1a; master_s…

sprintf用法詳解

printf可能是許多程序員在開始學習C語言時接觸到的第二個函數&#xff08;我猜第一個是main&#xff09;&#xff0c;說起來&#xff0c;自然是老朋友了&#xff0c;可是&#xff0c;你對這個老朋友了解多嗎&#xff1f;你對它的那個孿生兄弟sprintf了解多嗎&#xff1f;在將各…

掌握 Ajax,第 2 部分: 使用 JavaScript 和 Ajax 發出異步請求

轉http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro2/ 掌握 Ajax&#xff0c;第 2 部分: 使用 JavaScript 和 Ajax 發出異步請求 在 Web 請求中使用 XMLHttpRequest 多數 Web 應用程序都使用請求/響應模型從服務器上獲得完整的 HTML 頁面。常常是點擊一個按鈕&#xff0…

Provisioning Services 7.8 入門系列教程之十一 通過版本控制自動更新虛擬磁盤

續Provisioning Services 7.8 入門系列教程之十 通過類自動更新虛擬磁盤從前兩的兩種更新方式可以看出&#xff0c;它們有一個共同的特點&#xff0c;即需要產生&#xff08;復制&#xff09;完成的虛擬磁盤副本&#xff0c;然后進行相關的升級操作。這兩種方法在實際生產中&am…

OC面試題

什么是KVC和KVO&#xff1f; 答&#xff1a;KVC(Key-Value-Coding)內部的實現&#xff1a;一個對象在調用setValue的時候&#xff0c; &#xff08;1&#xff09;首先根據方法名找到運行方法的時候所需要的環境參數。 &#xff08;2&#xff09;他會從自己isa指針結合環境參數&…

【算法】QuickSort

快速排序&#xff0c;時間復雜度O(N*logN)&#xff0c;要能熟練掌握&#xff01; 以下主要參考http://blog.csdn.net/morewindows/article/details/6684558&#xff0c; 感謝原博主&#xff01; 該方法的基本思想是&#xff1a; 1&#xff0e;先從數列中取出一個數作為基準數。…

串口之GetCommState、SetCommState函數詳解

GetCommState 讀取串口設置(波特率,校驗,停止位,數據位等).函數聲明&#xff1a;BOOL GetCommState(HANDLE hFile,LPDCB lpDCB);GetCommState函數的第一個參數hFile是由CreateFile函數返回指向已打開串行口的句柄。第二個參數指向設備控制塊DCB。如果函數調用成功&#xff0c;則…

登錄失敗時記住訪問的地址

登錄失敗時記住訪問的地址 使用spring MVC 訪問時,在攔截器中記錄訪問的地址: Java代碼 String path request.getRequestURI();//"/demo_channel_terminal/news/list" System.out.println("您無權訪問:" path); //用于登錄成功…

串口之GetCommTimeouts、SetCommTimeouts函數詳解

Windows系統利用此函數獲取特定的通訊設備讀寫時的超時參數設定&#xff0c;GetCommTimeouts函數聲明如下&#xff1a;BOOL GetCommTimeouts(HANDLE hFile,LPCOMMTIMEOUTS lpCommTimeouts);GetCommTimeouts函數的第一個參數hFile是由CreateFile函數返回指向已打開串行口的句柄。…

GUN/LINUX命令之 cp mv install

1. cp命令 復制copy命令的簡寫 SYNOPSIS cp [OPTION]... [-T] SOURCE DEST cp [OPTION]... SOURCE... DIRECTORY cp [OPTION]... -t DIRECTORY SOURCE... cp SOURCE DEST 后者如果是目錄那么源文件就復制到文件夾里面并且保持著原來的名字&#xff1b;如果D…

Tomcat - Maven plugin: 運行找不到webapp

2019獨角獸企業重金招聘Python工程師標準>>> The tomcat7-maven-plugin allows running the current project as a Web application and additional <webapps> can be specified that will be simultaneously loaded into tomcat. My project is not a Web ap…

面試題3

1. 你如何理解 iOS 內存管理 1. new alloc copy retain這些對象我們都要主動的release或者 autorelease 2. 如果是類方法創建的對象,那么系統自動釋放池自動在適當的 時候會幫我們 release 3. ARC xcode 自動會幫我們人工智能的添加 release autorelease 操 作 2. C語言里的數…

基于MQTT協議進行應用開發

來自&#xff1a;http://www.cnblogs.com/secondtononewe/p/6073089.html 官方協議有句如下的話來形容MQTT的設計思想&#xff1a; “It is designed for connections with remote locations where a "small code footprint" is required or the network bandwidth i…

SortedDictionaryTKey,TValue正序與反序排序及Dicttionary相關

SortedDictionary<TKey,TValue>能對字典排序 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace SortDictionary {class Program{static void Main(string[] args){TestDictionarySort();…

DOS窗口的編碼頁從UTF-8調回GBK

2019獨角獸企業重金招聘Python工程師標準>>> 之前在DOS窗口操作MySQL數據庫的時候&#xff0c;將編碼頁從GBK設置成了UTF-8&#xff0c;解決了在DOS窗口顯示MySQL數據庫中的表中的中文字符出現亂碼的問題。但是除此之外&#xff0c;DOS窗口顯示的其他中文字符都是亂…

UIBezierPath

學習UIBezierPath畫圖 筆者在寫本篇文章之前&#xff0c;也沒有系統學習過貝塞爾曲線&#xff0c;只是曾經某一次的需求需要使用到&#xff0c;才臨時百度看了一看而且使用最基本的功能。現在總算有時間停下來好好研究研究這個神奇而偉大的貝塞爾先生&#xff01; 筆者在學習時…