青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

面對(duì)現(xiàn)實(shí),超越自己
逆水行舟,不進(jìn)則退
posts - 269,comments - 32,trackbacks - 0
向文件寫入信息:
 
1     CFile file;
2     file.Open(sMainIniPath, CFile::modeRead);
3     BOOL bSuccess = ::WritePrivateProfileString("UKEY""value", sUserID, sMainIniPath);
4     LOG("寫入用戶UKEY信息%s", bSuccess ? "成功" : "失敗");
5     file.Close();
讀取文件信息:
 
 1        CString sKeyFileDir = “C:\test.ini”;
 2         if (CFileFind().FindFile(sKeyFileDir))
 3         {
 4             if (::GetPrivateProfileString("UKEY""value""",sUserID.GetBuffer(100), 100, sKeyFileDir) > 0)
 5             {
 6                 LOG("讀取配置文件%s獲取UKEY信息%s成功,刪除Test.ini文件", sKeyFileDir, sUserID);
 7             }
 8          }
 9         else
10         {
11             LOG("沒(méi)有發(fā)現(xiàn)Test.ini文件");
12             g_sMsg.Format("沒(méi)有發(fā)現(xiàn)Test.ini文件%s", sKeyFileDir);
13             return 1;
14         }

下面文章轉(zhuǎn)自:http://blog.csdn.net/kevin_ysu/article/details/6334524

第一部分:文本文件

文本文件的讀寫

認(rèn)識(shí)CFile類;認(rèn)識(shí)文本文件;能夠正確靈活應(yīng)用文本文件存取信息;避免文本文件讀寫的常見(jiàn)誤區(qū)。

CFile是MFC的文件操作基本類,它直接支持無(wú)緩沖的二進(jìn)制磁盤I/O操作,并通過(guò)其派生類支持文本文件、內(nèi)存文件和socket文件。

客戶操作記錄實(shí)例功能預(yù)覽及關(guān)鍵知識(shí)點(diǎn)

許多系統(tǒng),出于安全或其他原因,常常要求隨時(shí)對(duì)鍵盤進(jìn)行監(jiān)控,利用Hook(鉤子)技術(shù)編寫的應(yīng)用程序能夠很好地達(dá)到這個(gè)目的。本軟件就制作了一個(gè)客戶操作記錄軟件,即在軟件運(yùn)行過(guò)程中,用戶在鍵盤上的按鍵操作會(huì)被記錄下來(lái),這樣對(duì)維護(hù)軟件的正常運(yùn)行非常有利。

只要啟動(dòng)客戶操作記錄軟件后,不管輸入焦點(diǎn)是否在本軟件上,按鍵都會(huì)被記錄下來(lái)。我們需要的是鍵盤的系統(tǒng)監(jiān)控,只要本軟件在運(yùn)行,無(wú)論當(dāng)前計(jì)算機(jī)在做什么,都能監(jiān)測(cè)到用戶按鍵的行為并做出反應(yīng),這就要用到Hook技術(shù)。

Hook技術(shù)在很多特殊軟件中廣泛應(yīng)用,如,金山詞霸的“取詞”功能,就用到了Hook計(jì)技術(shù)。

鉤子的本質(zhì)是一段用以處理系統(tǒng)消息的程序,通過(guò)系統(tǒng)調(diào)用,將其掛入系統(tǒng)。鉤子的種類很多,每種鉤子可以截獲并處理相應(yīng)的消息,每當(dāng)特定的消息發(fā)出,在到達(dá)目的窗口之前,鉤子程序先行截獲該消息、得到對(duì)此消息的控制權(quán)。此時(shí)在鉤子函數(shù)中就可以對(duì)截獲的消息進(jìn)行加工處理,甚至可以強(qiáng)制結(jié)束消息的傳遞。

從鉤子的本質(zhì)來(lái)看,可以優(yōu)先截獲操作系統(tǒng)的各種消息進(jìn)行處理,所以它幾乎無(wú)所不能,因?yàn)閣indows的應(yīng)用程序都是基于消息驅(qū)動(dòng)的,應(yīng)用程序的操作都依賴于它所得到的消息的類型及內(nèi)容。

如果Hook過(guò)程在應(yīng)用程序中實(shí)現(xiàn),若應(yīng)用程序不是當(dāng)前窗口時(shí),該Hook就補(bǔ)齊作用;如果Hook在DLL中實(shí)現(xiàn),程序在運(yùn)行中動(dòng)態(tài)調(diào)用它,它能實(shí)時(shí)對(duì)系統(tǒng)進(jìn)行監(jiān)控。根據(jù)需要,我們采用的是在DLL中實(shí)現(xiàn)Hook的方式。

(應(yīng)用程序exe? 和DLL的區(qū)別所在)

文本文件存儲(chǔ)管理

字符被計(jì)算機(jī)處理時(shí)都是以二進(jìn)制代碼的形式出現(xiàn)的,即一個(gè)字符對(duì)應(yīng)一個(gè)8位二進(jìn)制數(shù),這種二進(jìn)制碼的集合就是所謂的ASCII碼。

基本的ASCII碼有128個(gè),最高位都是0,對(duì)應(yīng)的十進(jìn)制數(shù)是0-127。鍵盤上的字符,如英文字母、數(shù)字和一些常用符號(hào),使用基本ASCII部分。如數(shù)字“0”的ASCII碼用二進(jìn)制數(shù)表示就是00110000(即十進(jìn)制數(shù)48)。

擴(kuò)展的ASCII碼有128個(gè),最高位是1,對(duì)應(yīng)的十進(jìn)制數(shù)是128-255。一些制表符和其他符號(hào)使用擴(kuò)展的ASCII碼部分。

為解決漢字的存儲(chǔ)和顯示問(wèn)題,我國(guó)制定了國(guó)際GB2312。據(jù)此規(guī)定,一個(gè)漢字由2個(gè)擴(kuò)展的ASCII碼組成,這種高位為1的雙字節(jié)漢字編碼就是漢字的機(jī)內(nèi)碼,簡(jiǎn)稱為內(nèi)碼。例如,漢字“學(xué)”的機(jī)內(nèi)碼用二進(jìn)制數(shù)表示就是11010001 10100111(即十進(jìn)制數(shù)206 和167 ),用十進(jìn)制表示就是53671(206*256+167)。對(duì)于字符,文本文件存儲(chǔ)的是它的ASCII碼,對(duì)于漢字,文本文件存儲(chǔ)的是它的內(nèi)碼,即兩位ASCII碼,如字符串“0學(xué)0”,在文本文件中存儲(chǔ)的內(nèi)容是00110000 11010001 10100111 00110000

正確的文本文件讀寫過(guò)程

1.定義文件變量;2.打開指定的文件;3.向從文本文件中寫入信息;4.從文本文件中讀取信息;5.關(guān)閉文件

1、定義文件變量

定義文件變量格式:CStdioFile 文件變量;

例如,定義一個(gè)名稱為f1的文件變量,語(yǔ)句如下:CStdioFile f1;

 

2、打開指定文件

可以直接通過(guò)CStdioFile的構(gòu)造函數(shù)來(lái)打開磁盤文件,同時(shí)可以用標(biāo)志位指定打開方式(只讀、只寫、讀寫等):

CStdioFile(LPCTSTR lpszFileName,UINT nOpenFlags);

其中,lpszFileName表示要打開的文件名,可以是相對(duì)路徑或絕對(duì)路徑

nOpenFlags設(shè)置文件打開方式標(biāo)志位,可以指定用“|”連接多個(gè)標(biāo)志位。下面是常用的打開標(biāo)志:

CFile::typeText:以文本文件的形式打開文件

CFile::typeBinary:以二進(jìn)制文件的形式打開文件

CFile::modeCreate:如果指定文件名的文件不存在,則新建文件;如果文件存在并且沒(méi)有設(shè)置CFile::modeNoTruncate標(biāo)志,則清空文件。

CFile::modeNoTruncate:如果文件存在,不把它的長(zhǎng)度刪除為0(即不清空文件中的數(shù)據(jù))。

CFile::modeRead:以只讀方式打開文件

CFile::modeReadWrite:以可讀可寫方式打開文件

CFile::modeWrite:以只寫方式打開文件

CFile::shareDenyNone:文件打開后,不禁止其他進(jìn)程對(duì)文件的讀寫操作

CFile::shareExclusive:文件打開后,禁止其他進(jìn)程對(duì)文件的讀寫操作

CFile::shareDenyRead:文件打開后,禁止其他進(jìn)程對(duì)文件的讀操作

CFile::shareDenyWrite:文件打開后,禁止其他進(jìn)程對(duì)文件的寫操作

此外,可以不在構(gòu)造函數(shù)中打開文件,而僅僅調(diào)用空的構(gòu)造函數(shù)CStidoFile(),然后用CStdioFile::Open()打開文件。Open函數(shù)的前兩個(gè)參數(shù)和非空構(gòu)造函數(shù)的參數(shù)相同,其聲明如下:

BOOL Open(LPCTSTR lpszFileName,UINT nOpenFlags,CFileException* pError=NULL);

第3個(gè)參數(shù)與打開失敗時(shí)的異常處理有關(guān)。

實(shí)例1:以只讀方式打開一個(gè)文件

步驟:

使用AppWizard創(chuàng)建一個(gè)對(duì)話框應(yīng)用程序,刪除其自動(dòng)產(chǎn)生的所有控件,添加一個(gè)Button控件。雙擊控件,在相應(yīng)的函數(shù)里添加代碼:

char * pszFileName="C://myfile.txt";

CStdioFile myFile;

CFileException fileException;

if(!myFile.Open(pszFileName,CFile::modeCreate|CFile::typeText|CFile::modeRead),&fileException)

{

TRACE("Can't open file %s, error = %u/n",pszFileName,fileException.m_cause);

}

運(yùn)行結(jié)果:如果C:/下沒(méi)有myfile.txt文件,則新生成該文件。

3.向從文本文件中寫入信息

CStdioFile提供了函數(shù)WriteString來(lái)向文本文件中寫入文本,WriteString函數(shù)的格式如下:

void WriteString(LPCTSTR lpsz);

WriteString的參數(shù)lpsz是一個(gè)以”/0”字符結(jié)束的字符串,要把這個(gè)字符串的內(nèi)容寫入文件。

提示:使用WriteString函數(shù)時(shí),如果希望每執(zhí)行一次WriteString,文本文件中的內(nèi)容就會(huì)自動(dòng)換行一次,那么就需要在需要換行的地方輸出“/n”:

myFile.WriteString(“第1行/n”);

實(shí)例2:向文件中寫入文本

建立MFC基于對(duì)話框的程序,刪除自動(dòng)添加的所有控件,添加一個(gè)“確定”按鈕,雙擊按鈕,按默認(rèn)添加事件函數(shù),雙擊按鈕,在相應(yīng)的函數(shù)處添加如下代碼:

char* pszFileName="C://myfile.txt";

CStdioFile myFile;

CFileException fileException;

if(myFile.Open(pszFileName,CFile::typeText|CFile::modeCreate|CFile::modeReadWrite),&fileException)

{

myFile.WriteString("第1行/n");

CString strOrder;

strOrder.Format("%d,%.3f",66,88.88);

myFile.WriteString(strOrder);

}

else

{

TRACE("Can't open file %s,error=%u/n",pszFileName,fileException.m_cause);

}

程序運(yùn)行結(jié)果:C:/myfile.txt文件中內(nèi)容如下:

第1行

66,88.880

4.從文本文件中讀取信息

CStidoFile提供了函數(shù)ReadString來(lái)讀取文本,ReadString有兩種形式,一種為:

virtual LPTSTR ReadString(LPTSTR lpsz, UINIT nMax);

ReadString函數(shù)的參數(shù)如下:

lpsz :是用戶提供的一個(gè)指向字符串的指針,它用來(lái)接受從文件讀出的文本,以”/0”結(jié)束。

nMax是本次所允許讀入的文本字符個(gè)數(shù),不計(jì)“/0”字符,也就是說(shuō)最多能讀入nMax-1個(gè)文本字符。

ReadString的返回值是一個(gè)LPTSTR類型的指針,它指向從文件讀出的文本字符串,如果到達(dá)文件尾,則返回NULL。

ReadString的另一種形式為:

BOOL ReadString(CString& rString);

參數(shù)rString用來(lái)容納從文件讀出的文本。

CString版本忽略回車換行符,返回值是一個(gè)布爾值。如果返回值為FALSE,表示因到達(dá)文件尾而沒(méi)有讀到任何字符。

提示:每執(zhí)行一次ReadString,就會(huì)自動(dòng)從文本文件中讀取一行數(shù)據(jù),同時(shí)文件操作指針會(huì)自動(dòng)跳轉(zhuǎn)到下一行。

實(shí)例3:從文件中讀取文本信息

步驟:創(chuàng)建基于對(duì)話框的MFC程序,刪除所有自動(dòng)添加的控件,添加按鈕控件,為按鈕添加事件,并在相應(yīng)的函數(shù)處,添加如下代碼:

char* pszFileName="C://myfile.txt";

CStdioFile myFile;

CFileException fileException;

if(myFile.Open(pszFileName,CFile::typeText|CFile::modeReadWrite),&fileException)

{

myFile.SeekToBegin();

CString str1;

myFile.ReadString(str1);

CString str2;

myFile.ReadString(str2);

AfxMessageBox(str1+str2);

}

else

{

TRACE("Can't open file %s,error=%u/n",pszFileName,fileException.m_cause);

}

myFile.Close();

程序運(yùn)行結(jié)果:為程序F9設(shè)置斷點(diǎn),然后F5單步執(zhí)行,結(jié)果如下:

clip_image001

5.關(guān)閉文件

對(duì)文件的操作完成后,使用CloseFile關(guān)閉文件。

函數(shù)CStdioFile::Close關(guān)閉一個(gè)文件,一般一個(gè)文件使用完畢就應(yīng)該關(guān)閉它:

myFile.Close();

錯(cuò)誤的文本文件讀寫過(guò)程

在讀寫文本文件的時(shí)候,最常見(jiàn)的錯(cuò)誤是---操作文件不存在。這種錯(cuò)誤產(chǎn)生的典型原因有:

1.路徑錯(cuò)誤

char * pszFileName="C://Windows//MyFile.txt";

CStdioFile myFile;

CFileException fileException;

if(!myFile.Open(pszFileName,CFile::modeCreate|CFile::typeText|CFile::modeReadWrite),&fileException)

{

//文件操作代碼

}

else

{

TRACE("Can't open file %s, error = %u/n",pszFileName,fileException.m_cause);

}

myFile.Close();

由于將文件變量與一個(gè)絕對(duì)路徑的文件名關(guān)聯(lián),而程序的數(shù)據(jù)通常存儲(chǔ)在相對(duì)路徑下,所以一旦相對(duì)路徑和相對(duì)路徑不一致時(shí),就會(huì)出錯(cuò)。

舉例而言,上一段程序本意是想從windows的安裝目錄下面的MyTextFile.txt文件中讀取一行數(shù)據(jù),但是如果操作系統(tǒng)安裝的路徑不是C:/Windwos,而是C:/Winnt,那么這段程序就會(huì)出錯(cuò)。

解決方法是在程序中使用相對(duì)路徑,改正后的程序如下:

//獲取windows路徑

LPTSTR lpBuffer=new char[MAX_PATH];

::GetWindowsDirectory(lpBuffer,MAX_PATH);

strcat(lpBuffer,"http://MyFile.txt");

CStdioFile myFile;

CFileException fileException;

if(myFile.Open(lpBuffer,CFile::typeText|CFile::modeCreate|CFile::modeReadWrite),&fileException)

{

//文件操作代碼

}

else

{

TRACE("Can't open file %s, error = %u/n",pszFileName,fileException.m_cause);

}

CString strFileTitle="MyFile.txt";

CStdioFile myFile;

CFileException fileException;

if(myFile.Open(strFileTitle,CFile::typeText|CFile::modeReadWrite),&fileException)

{

//文件操作代碼

myFile.WriteString("測(cè)試!");

}

else

{

TRACE("Can't open file %s, error = %u/n",pszFileName,fileException.m_cause);

}

myFile.Close();

2.操作文件不存在

如果應(yīng)用程序所有路徑下面不存在MyFile.txt文件,那么在WriteString寫入信息時(shí)就會(huì)出錯(cuò)。

解決辦法就是在程序中打開文件前要檢查是否存在此文件。如下程序:

CString strFileTitle="MyFile.txt";

CFileFind finder;

if(finder.FindFile(strFileTitle))

{

CStdioFile myFile;

CFileException fileException;

if(myFile.Open(lpBuffer,CFile::typeText|CFile::modeCreate|CFile::modeReadWrite),&fileException)

{

//文件操作代碼

}

else

{

TRACE("Can't open file %s, error = %u/n",pszFileName,fileException.m_cause);

}

}

else

{

TRACE("Can't find file %s/n",strFileTitle);

}

myFile.Close();

3.超越文件權(quán)限進(jìn)行讀寫操作

在打開文件的過(guò)程中,通過(guò)參數(shù)指定了文件的讀寫權(quán)限,如果讀寫的操作沒(méi)有和相應(yīng)的權(quán)限對(duì)應(yīng),就會(huì)出現(xiàn)錯(cuò)誤。

下面的程序就是典型的忽略了文件操作權(quán)限的例子:

CString strFileTitle="MyFile.txt";

CStdioFile myFile;

CFileException fileException;

if(myFile.Open(strFileTitle,CFile::typeText|CFile::modeCreate|CFile::NoTruncate|CFile::modeRead),&fileException)

{

//文件操作代碼

myFile.WriteString("測(cè)試!");

}

else

{

TRACE("Can't open file %s,error=%u/n",strFileTitle,fileException.m_cause);

}

myFile.Close();

支招兒:

1.準(zhǔn)確定位文件的路徑

操作文件的過(guò)程中,經(jīng)常需要將文本文件放在程序自身的目錄中,但是如果僅僅在程序中使用不指定任何路徑信息的相對(duì)路徑,如:

myFile.Open("MyFile.txt",CFile::modeCreate|CFile::typeText|CFile::modeReadWrite);

那么就有可能出現(xiàn)不能正確定位的情況,準(zhǔn)確定位文件位置的方法是獲得可執(zhí)行程序自身的絕對(duì)路徑,如:

TCHAR FilePath[MAX_PATH];

GetModuleFileName(NULL,FilePath,MAX_PATH);

(_tcstchr(FilePath,'//'))[1]=0;

lstrcat(FilePath,_T("MyFile.txt"));

CStdioFile myFile;

CFileException fileException;

if(myFile.Open(FilePath,CFile::modeCreate|CFile::typeText|CFile::modeReadWrite),&fileException)

{

//文件操作代碼

}

else

{

TRACE("Can't open file %s,error=%u/n",FilePath,fileException.m_cause);

}

myFile.Close();

2.讀文本文件指定的一行,并得到文本文件的總行數(shù)。

讀文本文件指定的一行,并得到文本文件的總行數(shù)

要統(tǒng)計(jì)文本文件的總行數(shù),可以從頭逐行讀,直到文件尾,程序:

CStdioFile myFile;

CFileException fileException;

if(myFile.Open("MyFile.txt",CFile::modeCreate|CFile::modeNoTruncate|CFile::typeText|CFile::modeReadWrite),&fileException)

{

CString strContent;

int order=1;

while(myFile.ReadString(strContent))

{

if(2==order)

{

AfxMessageBox(strContent);

}

order=order+1;

}

}

else

{

TRACE("Can't open file");

}

myFile.Close();

實(shí)例演示文件操作過(guò)程

客戶操作記錄實(shí)例

本軟件分為兩個(gè)部分,一部分是DLL模塊,里面利用Hook技術(shù)完成鍵盤監(jiān)控和寫入文件的功能;另一部分是界面部分,調(diào)用DLL啟動(dòng)和停止客戶操作記錄功能。

第1步:創(chuàng)建MFC DLL項(xiàng)目

第2步:創(chuàng)建TestHook.h文件

第3步:加入全局共享數(shù)據(jù)變量

第4步:保存DLL實(shí)例句柄

第5步:類CKeyboradHook的成員函數(shù)

第6步:創(chuàng)建鉤子可執(zhí)行程序

第1步:創(chuàng)建MFC DLL項(xiàng)目

創(chuàng)建一個(gè)名為HookTest的project,project的類型為選擇MFC AppWizard(DLL),DLL類型為MFC Extension DLL(using shared MFC DLL)

注意:選擇File->New菜單項(xiàng),在彈出對(duì)話框的左邊的列表框中選擇MFC AppWizard(DLL).

在project name文本框中輸入項(xiàng)目名稱,HookTest;location中輸入項(xiàng)目的存盤路徑;選中Create new workspace;在platForms列表中選擇Win32選項(xiàng)。

單擊OK按鈕繼續(xù)下一步,在彈出的對(duì)話框中設(shè)置DLL類型為MFC Extension DLL(using shared MFC DLL).

在IDE中,選擇FileView選項(xiàng)卡,在其中就會(huì)發(fā)現(xiàn)其中有HookTest.cpp文件,卻沒(méi)有HookTest.h文件,這是因?yàn)関isual C++6.0中沒(méi)有現(xiàn)成的鉤子類,所以要自己動(dòng)手創(chuàng)建TestHook.h文件,在其中建立鉤子類。

第2步:創(chuàng)建TestHook.h文件

選擇File菜單,再選擇New菜單項(xiàng),將彈出New對(duì)話框。選擇files選項(xiàng)卡,并且選擇其中的C/C++ Header File.

選中add to project,并且在對(duì)應(yīng)的下拉列表中選擇項(xiàng)目名稱HookTest;在location文本框中輸入項(xiàng)目的存盤路徑,或單擊右邊的按鈕選擇相應(yīng)的路徑;在file對(duì)應(yīng)的文本框中輸入文件名HookTest.h;單擊OK按鈕,在IDE中自動(dòng)打開Hooktest.h文件供編輯代碼用;

TestHook.h文件:

#if _MSC_VER>1000

#pragma once

#endif //_MSC_VER>1000

class AFX_EXT_CLASS CHookTest:public CObject

{

public:

CHookTest();

~CHookTest();

BOOL StartHook();//StartHook()函數(shù)實(shí)現(xiàn)安裝鉤子

BOOL StopHook();//StopHook()函數(shù)實(shí)現(xiàn)卸載鉤子

};

第3步:加入全局共享數(shù)據(jù)變量

HookTest.cpp文件中添加:

//存儲(chǔ)各個(gè)鍵賭贏的字符

CString cskey[TOTAL_KEYS]=

{

"BACKSPACE",

"TAB",

……

"F12",

};

//存儲(chǔ)各個(gè)鍵對(duì)應(yīng)的鍵值

int nkey[TOTAL_KEYS]=

{

0X08, //"BACKSPACE",

0X09, //"TAB",

…….

0x7b,//"F12",

};

#pragma data_seg("mydata")

//安裝的鍵盤鉤子子句柄

HHOOK glhTestHook=NULL;

//DLL實(shí)例句柄

HINSTANCE glhkInstance=NULL;

#pragma data_seg()

第4步:保存DLL實(shí)例句柄

DllMain函數(shù)中添加如下代碼:

if (dwReason == DLL_PROCESS_ATTACH)

{

TRACE0("HOOKTEST.DLL Initializing!/n");

//擴(kuò)展DLL僅初始化一次

if (!AfxInitExtensionModule(HookTestDLL, hInstance))

return 0;

//DLL加入動(dòng)態(tài)MFC類庫(kù)中

new CDynLinkLibrary(HookTestDLL);

//保存DLL實(shí)例句柄

glhkInstance=hInstance;

}

else if (dwReason == DLL_PROCESS_DETACH)

{

TRACE0("HOOKTEST.DLL Terminating!/n");

//終止這個(gè)鏈接庫(kù)前調(diào)用它

AfxTermExtensionModule(HookTestDLL);

}

return 1; // ok

第5步:類CKeyboradHook的成員函數(shù)

//KeyboradProc函數(shù)

LRESULT WINAPI KeyboradProc(int nCode,WPARAM wParam,LPARAM lParam)

{

for(int i=0;i<TOTAL_KEYS;i++)

{

if(nkey[i]==(int)wParam)

{

int nKeyStatus=lParam &0x80000000;

//根據(jù)用戶按鍵播放對(duì)應(yīng)的聲音文件

switch(nKeyStatus)

case 0://WM_KEYUP

//case 0x80000000://WM_KEYUP

{

char* pszFileName="C://myfile.txt";

CStdioFile myFile;

CFileException fileException;

if(myFile.Open(pszFileName,CFile::typeText|CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite),&fileException)

{

myFile.SeekToEnd();

//將文件指針移動(dòng)到文件末尾準(zhǔn)備進(jìn)行追加文本的操作

//此處可以編寫追加文本的操作

myFile.WriteString(cskey[i]);

}

else

{

TRACE("Can't open file %s,error=%u/n",pszFileName,fileException.m_cause);

}

}

}

}

//調(diào)用CallNextHookEx函數(shù)把鉤子信息傳遞給鉤子鏈的下一個(gè)鉤子函數(shù)

return CallNextHookEx(glhTestHook,nCode,wParam,lParam);

}

第6步:創(chuàng)建鉤子可執(zhí)行程序

//****************************

BOOL CHookTest::StartHook()

{

glhTestHook=SetWindowsHookEx(WH_KEYBOARD,KeyboradProc,glhkInstance,0);

if(glhTestHook!=NULL)

return TRUE;

return FALSE;

}

//****************************

/*

HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,INSTANCE hMod,DWORD dwThreadId)

idHook:鉤子類型,它是和鉤子函數(shù)類型一一對(duì)應(yīng)的,例如,WH_KEYBOARD表示安裝的是鍵盤鉤子,WH_MOUSE表示的是鼠標(biāo)鉤子等。

lpfn:鉤子函數(shù)的地址

hMod:鉤子函數(shù)所在的實(shí)例的句柄,對(duì)于線程鉤子,該參數(shù)為NULL;對(duì)于系統(tǒng)鉤子,該參數(shù)為鉤子函數(shù)的DLL句柄

dwThreadId:指定鉤子所監(jiān)視的線程的線程號(hào),對(duì)于全局鉤子,該參數(shù)為NULL.

SetWindowsHookEx返回所安裝的鉤子句柄。

調(diào)用StartHook函數(shù)后,所有鍵盤的消息都會(huì)轉(zhuǎn)移到KeyboradProc函數(shù)中,通過(guò)數(shù)組nkey的值與wParam參數(shù)相比較,可以知道用戶按下的是哪個(gè)鍵,通過(guò)對(duì)IParam值的判斷,可以知道是按下鍵還是釋放鍵,然后播放鍵對(duì)應(yīng)的聲音文件即可。

*/

//****************************

//卸載鉤子

BOOL CHookTest::StopHook()

{

BOOL bResult=FALSE;

if(glhTestHook)

{

bResult=UnhookWindowsHookEx(glhTestHook);

if(bResult)

{

glhTestHook=NULL;

}

}

return bResult;

}

//****************************

第二部分:INI文件

INI文件的讀寫

Windows操作系統(tǒng)將win.ini作為記錄當(dāng)前系統(tǒng)狀態(tài),并根據(jù)其記錄內(nèi)容對(duì)系統(tǒng)進(jìn)行配置的一種便捷的方法,且眾多的應(yīng)用軟件也廣泛的使用該類型的配置文件來(lái)對(duì)軟件進(jìn)行記錄和配置。

配置設(shè)置文件(INI)文件是windows操作系統(tǒng)中的一種特殊的ASCII文件,以ini為文件擴(kuò)展名。該文件也被稱為初始化文件initialization file和概要文件profile,通常應(yīng)用程序可以擁有自己的配置設(shè)置文件來(lái)存儲(chǔ)狀態(tài)信息。一般來(lái)說(shuō)私有的配置設(shè)置文件比較小,這樣可以減少程序在初始化時(shí)讀取配置文件時(shí)的信息量,從而提高程序的啟動(dòng)速度、提高應(yīng)用程序和系統(tǒng)的性能。

如果帶存取的信息涉及到windows系統(tǒng)環(huán)境或是其他應(yīng)用程序時(shí),就必須在windows系統(tǒng)的配置文件win.ini中記錄并在訪問(wèn)的同時(shí)發(fā)送WM_WININICHANGE消息給所有的頂層窗口,通知其他的程序系統(tǒng)配置文件已做了更改。但由于win.ini中不僅記錄了系統(tǒng)的有關(guān)信息,也存儲(chǔ)著許多其他應(yīng)用軟件的配置數(shù)據(jù),所以訪問(wèn)的數(shù)據(jù)量要遠(yuǎn)比私有配置文件大的多。

掌握內(nèi)容 :

了解INI文件的結(jié)構(gòu);能夠正確靈活的應(yīng)用INI文件存取信息;避免INI文件讀寫的常見(jiàn)誤區(qū)。

INI文件存儲(chǔ)管理

配置文件里的信息之所以能為系統(tǒng)和終生的軟件所讀取并識(shí)別,是由于其內(nèi)部對(duì)數(shù)據(jù)的存取采用了預(yù)先約定的“項(xiàng)-值對(duì)(entry-value pairs)”存儲(chǔ)結(jié)構(gòu),并對(duì)待存取的數(shù)據(jù)分門別類地進(jìn)行調(diào)理清晰的存儲(chǔ)。INI文件的結(jié)構(gòu)如下:

;注釋

[小節(jié)名]

關(guān)鍵字=值

INI文件允許有多個(gè)小節(jié),每個(gè)小節(jié)又允許有多個(gè)關(guān)鍵字,“=”后面是該關(guān)鍵字的值。值的類型有3種:字符串、整型數(shù)值和布爾值。其中字符串存儲(chǔ)在INI文件中時(shí)沒(méi)有引號(hào),布爾值用1表示,布爾假值用0表示。

注釋以分號(hào)“;”開頭。

Windows操作系統(tǒng)專門為此提供了6個(gè)API函數(shù)來(lái)對(duì)配置設(shè)置文件進(jìn)行讀、寫:

GetPrivateProfileInt: 從私有初始化文件(即自定義的INI文件)獲取整型數(shù)值。

GetPrivateProfileString: 從私有初始化文件獲取字符串型值。

GetProfileInt:從win.ini獲取整數(shù)值。

WritPrivateProfileString:寫字符串到私有初始化文件。

WriteProfileString:寫字符串到win.ini。

需要指出的是,當(dāng)向配置文件存儲(chǔ)信息時(shí),不論是數(shù)據(jù)還是字符串都要先轉(zhuǎn)換成字符串,然后再進(jìn)行存儲(chǔ)。

這里只介紹私有初始化文件,所以只涉及到3個(gè)函數(shù)---GetPrivateProfileString、GetPrivateProfileInt和WritePrivateProfileString。

INI文件讀寫過(guò)程

INI文件的讀和寫操作是分開的,首先介紹寫文件的方法。

1. INI文件的寫過(guò)程

將信息寫入INI文件中所用的函數(shù)為:

BOOL WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR lpString,LPCTSTR lpFileName);

其中各參數(shù)的意義:

lpAppName:是INI文件中的一個(gè)字段名。

lpKeyName:是lpAppName下的一個(gè)鍵名,通俗講就是變量名。

lpString:是鍵值,也就是變量的值,不過(guò)必須為L(zhǎng)PCTSTR型或CString型的。

lpFileName:是完整的INI文件名。

實(shí)例1:將信息寫入INI文件

將一名學(xué)生的姓名和年齡寫入C:/student.ini文件中。

步驟:創(chuàng)建基于對(duì)話框的MFC程序,刪除所有自動(dòng)生成的控件,然后添加按鈕控件,并在相應(yīng)的按鈕事件處添加如下代碼:

CString strName,strTemp;

int nAge;

strName="張三";

nAge=12;

::WritePrivateProfileString("Info","Name",strName,"C://student.ini");

strTemp.Format("%d",nAge);

::WritePrivateProfileString("Info","Age",strTemp,"C://student.ini");

運(yùn)行結(jié)果:C盤下創(chuàng)建了student.ini文件,文件內(nèi)容如下:

[Info]

Name=張三

Age=12

2. INI文件的讀過(guò)程

將信息從 INI文件中讀出到程序中所用的函數(shù)為 :

DWORD GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefault,LPTSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName);

其中,各參數(shù)的意義如下:

前兩個(gè)參數(shù)與WritePrivateProfileString中的意義一樣。

lpDefault:如果INI文件中沒(méi)有前兩個(gè)參數(shù)指定的字段名或鍵名,則將此值賦給變量。

lpReturnedString:接收INI文件中沒(méi)有前兩個(gè)參數(shù)指定的字段名或鍵名,則將此值賦給變量。

lpReturnedString:接受INI文件中的值的CString對(duì)象,即目的緩存器。

nSize:目的緩存器的大小。

lpFileName:是完整的INI文件名。

實(shí)例2:從INI文件讀出信息

程序?qū):/student.ini文件中的信息讀出到程序中。

步驟:如前,在相應(yīng)的button按鈕響應(yīng)事件函數(shù)處,添加如下代碼:

CString strStudName;

int nStudAge;

GetPrivateProfileString("Info","Name","默認(rèn)姓名",strStudName.GetBuffer(MAX_PATH),MAX_PATH,"C://student.ini");

//讀入整型值

//UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault,LPCTSTR lpFileName);

nStudAge=GetPrivateProfileInt("Info","Age",10,"C://student.ini");

運(yùn)行結(jié)果:可以通過(guò)設(shè)置斷點(diǎn),來(lái)查看strStudName和nStudAge的內(nèi)容。

錯(cuò)誤的INI文件讀寫

1.路徑指示錯(cuò)誤

INI文件的路徑必須完整,文件名前面的各級(jí)目錄必須存在,否則寫入不成功,該函數(shù)返回FALSE值。

如下程序:

CString strName,strTemp;

int nAge;

strName=”張三”;

nAge=12;

::WritePrivateProfileString(“Info”,”Name”,strName,”c://Info/student.ini”);

如果C:/Info目錄不存在,那么寫INI文件的操作就會(huì)失敗。

解決辦法是進(jìn)行文件操作前通過(guò)以下代碼檢查目錄是否存在:

WIN32_FIND_DATA fd;

HANDLE hFind=FindFirstFile(“C://Info”,&fd);

If((hFind!=INVALID_HANDLE_VALUE)&&(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))

{

AfxMessageBox(“存在”);

}

else

{

AfxMessageBox(“不存在”);

}

FindClose(hFind);

2.認(rèn)識(shí)上的兩個(gè)誤區(qū)

誤區(qū)一:寫文件路徑的時(shí)候?qū)懗芍T如C:/Info的形式,實(shí)際上在visual C++中,文件名的路徑中必須為//,因?yàn)樵趘isual C++中//才表示一個(gè)/,所以正確的格式應(yīng)改為C://Info.

誤區(qū)二:因?yàn)榻?jīng)常需要把INI文件放在程序所在目錄,所以在寫INI文件的函數(shù)中直接將lpFileName參數(shù)設(shè)置為文件名,如“student.ini”。這是不正確的做法,打開INI文件的時(shí)候,如果文件名沒(méi)有指明路徑的話,那么這個(gè)INI文件會(huì)存儲(chǔ)在windows目錄中,而不是在應(yīng)用程序的當(dāng)前目錄中。

解決辦法是lpFileName參數(shù)設(shè)置為“.//student.ini”。

教你一招----如何循環(huán)讀寫多個(gè)值

假設(shè)現(xiàn)在有一個(gè)程序,要將最近使用的幾個(gè)文件名保存下來(lái),寫入的代碼如下:

CString strTemp,strTempA;

int I;

int nCount=6;

for(i=0;i<nCount;i++)

{

strTemp.Format(“%d”,i);

strTemp.Format(“%s%d%s”,”File”,i,”.txt”);//文件名

::WritePrivateProfileStirng(“UseFileName”,”FileName”+strTemp,strTempA,”c://usefile.ini”);

}

strTemp.Format(“%d”,nCount);

::WritePrivateProfileString(“FileCount”,”Count”,strTemp,”C://usefile.ini”);

//將文件總數(shù)寫入,以便讀出。

以上代碼運(yùn)行后,C盤下面userfile.ini文件內(nèi)容。

實(shí)例3:將信息寫入INI文件

步驟:創(chuàng)建基于對(duì)話框的MFC程序,刪除所有自動(dòng)生成的控件,然后添加按鈕控件,并在相應(yīng)的按鈕事件處添加如下代碼:

CString strTemp,strTempA;

int i;

int nCount=6;

for(i=0;i<nCount;i++)

{

strTemp.Format("%d",i);

strTempA.Format("%s%d%s","File",i,".txt");//文件名

::WritePrivateProfileString("UseFileName","FileName"+strTemp,strTempA,"c://usefile.ini");

}

strTemp.Format("%d",nCount);

::WritePrivateProfileString("FileCount","Count",strTemp,"C://usefile.ini");

運(yùn)行結(jié)果:C盤下創(chuàng)建了usefile.ini文件,文件內(nèi)容如下:

[UseFileName]

FileName0=File0.txt

FileName1=File1.txt

FileName2=File2.txt

FileName3=File3.txt

FileName4=File4.txt

FileName5=File5.txt

[FileCount]

Count=6

實(shí)例4:從INI文件讀出信息

程序?qū):/student.ini文件中的信息讀出到程序中。

步驟:如前,在相應(yīng)的button按鈕響應(yīng)事件函數(shù)處,添加如下代碼:

CString strTemp,strTempA;

int i;

int nCount;

nCount=::GetPrivateProfileInt("FileCount","Count",0,"c://usefile.ini");

for(i=0;i<nCount;i++)

{

strTemp.Format("%d",i);

strTemp="FileName"+strTemp;

::GetPrivateProfileString("UseFileName",strTemp,"default.txt",strTempA.GetBuffer(MAX_PATH),MAX_PATH,"c://usefile.ini");

//strTempA中就存儲(chǔ)了文件名

}

運(yùn)行結(jié)果:可以通過(guò)設(shè)置斷點(diǎn),來(lái)查看strTemp和strTempA的內(nèi)容



posted on 2012-05-17 16:46 王海光 閱讀(7200) 評(píng)論(0)  編輯 收藏 引用 所屬分類: MFC
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精品青青大伊人av| 久久成人国产| 国产精品毛片在线| 欧美好吊妞视频| 欧美美女视频| 欧美日韩综合不卡| 国产欧美视频一区二区| 国户精品久久久久久久久久久不卡 | 久久综合伊人77777麻豆| 久久综合久久综合九色| 欧美国产国产综合| 国产精品国产自产拍高清av| 国产一区二区三区视频在线观看| 好看不卡的中文字幕| 亚洲人成在线影院| 亚洲欧美在线高清| 欧美mv日韩mv亚洲| 中文在线不卡| 久久天堂成人| 欧美性大战久久久久| 在线看一区二区| 亚洲专区一区二区三区| 男同欧美伦乱| 亚洲影视在线播放| 欧美高清在线一区二区| 国产欧美精品va在线观看| 亚洲人成亚洲人成在线观看图片| 亚洲影视综合| 亚洲国产mv| 久久不见久久见免费视频1| 欧美激情五月| 日韩一区二区精品视频| 亚洲欧美视频在线观看| 亚洲第一级黄色片| 西西裸体人体做爰大胆久久久| 欧美高清自拍一区| 亚洲成人影音| 久久久另类综合| 亚洲夜晚福利在线观看| 欧美精品久久一区二区| 在线成人免费观看| 欧美一级艳片视频免费观看| 亚洲黄网站黄| 浪潮色综合久久天堂| 国产视频一区在线观看一区免费| 国产精品99久久99久久久二8 | 久久夜色撩人精品| 亚洲综合精品一区二区| 欧美日韩一区在线视频| 日韩视频免费观看高清在线视频 | 亚洲综合色在线| 欧美日韩情趣电影| 亚洲精品国产拍免费91在线| 欧美大香线蕉线伊人久久国产精品| 欧美在线观看你懂的| 国产欧美日韩麻豆91| 欧美一区二区三区的| 中国成人黄色视屏| 国产精品毛片va一区二区三区| 亚洲视屏一区| 日韩午夜剧场| 国产精品高潮呻吟| 午夜一区二区三区不卡视频| 亚洲午夜高清视频| 国产精品高潮呻吟| 欧美亚洲在线视频| 欧美一区综合| 在线欧美亚洲| 亚洲国产欧美久久| 欧美精品日日鲁夜夜添| 亚洲一级黄色| 亚洲欧美日韩国产综合在线| 国产欧美一级| 老色鬼精品视频在线观看播放| 久久天天躁狠狠躁夜夜爽蜜月 | 一区二区三区久久网| 日韩一级大片| 国产欧美一区二区三区沐欲| 久久久久国产免费免费| 久久婷婷国产综合国色天香| 亚洲精品一区二区三区在线观看| 91久久精品国产| 欧美午夜影院| 久久久在线视频| 欧美大片在线观看一区| 欧美精品一区二区三区视频| 一本久久a久久精品亚洲| 国产精品久久久91| 欧美专区福利在线| 久久综合久久美利坚合众国| 日韩一本二本av| 亚洲欧美日韩一区| 亚洲福利精品| 亚洲一区二区三区精品在线 | 国产精品色网| 欧美fxxxxxx另类| 欧美日韩一区二区视频在线| 亚洲欧美亚洲| 免费h精品视频在线播放| 亚洲性感美女99在线| 久久国产精品网站| 亚洲一区二区三区在线看| 久久久欧美一区二区| 亚洲一区二区久久| 久久综合国产精品台湾中文娱乐网 | 欧美日韩国产一级片| 久久免费视频在线观看| 欧美日韩国产123| 麻豆精品精华液| 国产精品三级久久久久久电影| 欧美激情一区二区三区不卡| 国产拍揄自揄精品视频麻豆| 亚洲精品少妇网址| 亚洲成人在线观看视频| 亚洲综合视频一区| 亚洲尤物在线视频观看| 欧美激情综合网| 蜜臀av在线播放一区二区三区| 国产精品成人aaaaa网站| 欧美激情一区二区三区在线视频| 韩国精品久久久999| 亚洲影院在线观看| 亚洲欧美久久| 国产精品白丝av嫩草影院 | 亚洲午夜性刺激影院| 艳女tv在线观看国产一区| 蜜乳av另类精品一区二区| 噜噜噜噜噜久久久久久91| 国产一区二区你懂的| 午夜精品久久久久久99热软件| 亚洲尤物视频网| 国产精品久久久久毛片软件 | 亚洲欧美日韩综合| 国产精品qvod| 亚洲一区二区三区四区视频 | 久久米奇亚洲| 韩国v欧美v日本v亚洲v| 久久成人免费网| 美国成人直播| 91久久久久久久久| 欧美—级在线免费片| 欧美怡红院视频| 久久综合九九| 激情综合视频| 久久综合婷婷| 亚洲电影免费在线| 一本大道久久a久久精二百| 免费观看成人| 亚洲精选在线| 午夜精品免费视频| 韩国成人福利片在线播放| 久久婷婷综合激情| 亚洲电影在线| 亚洲字幕在线观看| 国色天香一区二区| 欧美夫妇交换俱乐部在线观看| 亚洲精品乱码久久久久| 亚洲综合电影一区二区三区| 国产视频观看一区| 麻豆国产精品777777在线| 亚洲欧洲日本一区二区三区| 国产精品稀缺呦系列在线| 欧美在线观看视频| 亚洲二区在线观看| 亚洲欧美久久久| 国产一区二区三区观看| 女人色偷偷aa久久天堂| 亚洲午夜视频在线| 久久夜色精品国产欧美乱极品| 亚洲免费高清| 国产一区二区三区在线观看网站 | 欧美日韩在线视频一区| 午夜精品久久久久久久白皮肤| 久久综合九色九九| 一区二区国产精品| 国产视频在线观看一区| 欧美二区在线播放| 性久久久久久久久| 亚洲精品视频免费观看| 久久精品人人做人人爽电影蜜月| 亚洲国产精品成人| 国产精品日韩在线一区| 免费不卡视频| 欧美一区国产一区| 99国产精品久久久久久久久久| 久久久五月婷婷| 亚洲欧美精品suv| 亚洲三级国产| 伊伊综合在线| 国产丝袜美腿一区二区三区| 欧美日韩三区| 欧美大尺度在线| 久久久久久久激情视频| 亚洲欧美视频在线| 一区二区三区|亚洲午夜| 亚洲国产欧美一区二区三区同亚洲 | 国产精品热久久久久夜色精品三区| 美女被久久久| 久久精品国产99精品国产亚洲性色| 一区二区三区色|