要實作一個當 Windows 執行後能夠自動執行的功能 , 可以在 Windows Registry 中
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
這個地方加入自己想要執行的物件。
基本上利用 RegSetValueEx 這個 API 來完成 , 所以...沒啥技巧 , 唯一要注意的就是
在VC2005 中Character set (Not set or UNICode) 時的處理。其實這是觀念問題了。
Not set :
charcFileName[256] = {0};
if (RegSetValueEx(hKey, sValueName, NULL, REG_SZ, (LPBYTE) sValue.GetBuffer(sValue.GetLength()), sValue.GetLength()) == ERROR_SUCCESS)
這樣寫沒問題
但若轉成 Unicode....
TCHARcFileName[256] = {0};
if (RegSetValueEx(hKey, sValueName, NULL, REG_SZ, (LPBYTE) sValue.GetBuffer(sValue.GetLength()), sValue.GetLength()*sizeof(TCHAR)) == ERROR_SUCCESS)
就要這樣寫 , 不然...寫到Registry 中 , 只會寫入一半
相關問題解答可以參考 : http://blog.yam.com/csylvia/trackback/18495463
底下是實作的程式碼 :
void xxxxxxxxx::CheckStartupSeting(void)
{
HKEY hKey;
LONG lRet;
HKEY hBaseKey = HKEY_LOCAL_MACHINE;
CString sValueName;
CString sKeyName;
CString sValue;
BOOL bError = TRUE;
TCHARcFileName[256] = {0};
TCHAR*pLast=0;
TCHAR*pCurrent=cFileName;
INT_PTR nTest;
nTest = m_auto_yes.GetCheck();
GetModuleFileName(NULL, cFileName, sizeof(cFileName));
sValue.Format(_T("%s"),pCurrent);
hBaseKey = HKEY_LOCAL_MACHINE;
sKeyName.Format(_T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"));
sValueName.Format(_T("ABCDEFGHIJK"));
lRet = RegOpenKeyEx(hBaseKey, sKeyName, 0, KEY_SET_VALUE, &hKey);
if (lRet != ERROR_SUCCESS)
lRet = RegCreateKeyEx(hBaseKey, sKeyName, 0, _T(""), 0, KEY_READ KEY_WRITE, NULL, &hKey, NULL);
if (m_auto_yes.GetCheck())
{
// create
if (lRet == ERROR_SUCCESS)
{
if (RegSetValueEx(hKey, sValueName, NULL, REG_SZ, (LPBYTE) sValue.GetBuffer(sValue.GetLength()), sValue.GetLength()*sizeof(TCHAR)) == ERROR_SUCCESS)
bError = FALSE;
}
}
else if (m_auto_no.GetCheck())
{
if (lRet == ERROR_SUCCESS)
{
//if (SHDeleteKey(hKey, cstrValueName) == ERROR_SUCCESS)//need include Shlwapi.lib
//{
//bError = FALSE;
//}
if (RegDeleteValue(hKey, sValueName) == ERROR_SUCCESS)
{
bError = FALSE;
}
}
}
RegCloseKey(hKey);
}