2013年3月6日 星期三

SetRegistryKey

今天在掃某個 MFC 的專案,注意到有一個叫 SetRegistryKey 的函式,一看到時遲疑了一下,想到其實就在新建立的專案中也可以看到這行,這才發現自己原來不認識,也從來沒去看一下這行 Code 是做什麼的。

查了一下文件:http://msdn.microsoft.com/zh-tw/library/7c2w6z4k(v=vs.80).aspx
因為根據文件所指,SetRegistryKey 會幫你做好在 HKEY_CURRENT_USER\Software 中建立應用程式機碼的準備,為何稱為準備呢,因為僅是調用 SetRegistryKey 並不會立即建立機碼,必須搭配以下六個 Function 使用才會建立應用程式對應的機碼,而這六個 Function 是方便開發者讀寫機碼用的

GetProfileInt // 取得整數型態的機碼
GetProfileString // 取得字串型態的機碼
GetProfileBinary // 取得二進位型態的機碼

WriteProfileInt // 寫入整數型態的機碼
WriteProfileString // 寫入字串型態的機碼
WriteProfileBinary // 寫入二進位型態的機碼

在使用了上敘的 6 個 Function 任何一支即會在以下路徑產生資料,

HKEY_CURRENT_USER\Software\<company name>\<application name>\<section name>\<value name>

例如我調用了以下指令

SetRegistryKey(_T("Ascii"));
WriteProfileInt(_T("Settings"), _T("dwAutoLogin"), TRUE);


此時就會在此處建立 Key 為 dwAutoLogin 且 Value 為 1 的一筆值,

HKEY_CURRENT_USER/software/Ascii/TestApp/Settings/

可以注意到,SetRegistryKey 中所設定的值其實是對應到 company name,而非 application name,所以如果我們在公司內有開發多支應用程式,其實理論上都是以同樣的 Key 建立才對,底下再又依應用程式名稱做分別。

此外有一點需要特別注意,上面提到的 6 個 Function 是屬於 CWinApp 的成員函式,所以在 CWinApp 以外的類別是無法使用的,必須透過建立 MFC 專案時,VS 幫我們自動產生的 theApp 物件來操作此 6 個 Function,例如我們建立 TestApp 時,VS 會自動幫我們產生以下程式碼,而其他類別目然就可以使用 theApp 操作 CWinApp 的資源如下

class CTestApp : public CWinApp
{
public:
CTestApp();

public:
virtual BOOL InitInstance();
DECLARE_MESSAGE_MAP()
};

extern CTestApp theApp;

void CSettingDialog::InitPageData()
{
    BOOL bAutoLogin = theApp.GetProfileInt(_T("Settings"), _T("dwAutoLogin"), FALSE);
    chkAutoLogin.SetCheck(bAutoLogin);
}

沒有留言:

張貼留言