Вот код, который, вероятно, сделает то, что вы хотите. Позвоните RegisterProgram
, чтобы ваш EXE самостоятельно зарегистрировался для автоматического запуска, когда пользователь входит в систему. Эта функция вызывает GetModuleFileName
, а затем вызывает другую вспомогательную функцию с именем RegisterMyProgramForStartup
, которая записывает в реестр.
Позвоните по номеру IsMyProgramRegisteredForStartup(L"My_Program")
, чтобы узнать, существует ли регистрация и действительно ли она действительна.
Однократное примечание. Влияние производительности проверки на то, чтобы увидеть, существует ли ключ до его фактического написания, незначительно. Вы можете просто вызвать RegisterProgram вслепую и перезаписать ключ, если он уже существует. Обнаружение, если регистрация существует, полезна для инициализации вашего пользовательского интерфейса, который включает или отключает автозапуск. (Вы даете своим пользователям выбор, верно? Потому что я ненавижу приложения, которые автоматически устанавливают себя для автоматического запуска, не давая мне выбора.)
BOOL IsMyProgramRegisteredForStartup(PCWSTR pszAppName)
{
HKEY hKey = NULL;
LONG lResult = 0;
BOOL fSuccess = TRUE;
DWORD dwRegType = REG_SZ;
wchar_t szPathToExe[MAX_PATH] = {};
DWORD dwSize = sizeof(szPathToExe);
lResult = RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_READ, &hKey);
fSuccess = (lResult == 0);
if (fSuccess)
{
lResult = RegGetValueW(hKey, NULL, pszAppName, RRF_RT_REG_SZ, &dwRegType, szPathToExe, &dwSize);
fSuccess = (lResult == 0);
}
if (fSuccess)
{
fSuccess = (wcslen(szPathToExe) > 0) ? TRUE : FALSE;
}
if (hKey != NULL)
{
RegCloseKey(hKey);
hKey = NULL;
}
return fSuccess;
}
BOOL RegisterMyProgramForStartup(PCWSTR pszAppName, PCWSTR pathToExe, PCWSTR args)
{
HKEY hKey = NULL;
LONG lResult = 0;
BOOL fSuccess = TRUE;
DWORD dwSize;
const size_t count = MAX_PATH*2;
wchar_t szValue[count] = {};
wcscpy_s(szValue, count, L"\"");
wcscat_s(szValue, count, pathToExe);
wcscat_s(szValue, count, L"\" ");
if (args != NULL)
{
// caller should make sure "args" is quoted if any single argument has a space
// e.g. (L"-name \"Mark Voidale\"");
wcscat_s(szValue, count, args);
}
lResult = RegCreateKeyExW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, NULL, 0, (KEY_WRITE | KEY_READ), NULL, &hKey, NULL);
fSuccess = (lResult == 0);
if (fSuccess)
{
dwSize = (wcslen(szValue)+1)*2;
lResult = RegSetValueExW(hKey, pszAppName, 0, REG_SZ, (BYTE*)szValue, dwSize);
fSuccess = (lResult == 0);
}
if (hKey != NULL)
{
RegCloseKey(hKey);
hKey = NULL;
}
return fSuccess;
}
void RegisterProgram()
{
wchar_t szPathToExe[MAX_PATH];
GetModuleFileNameW(NULL, szPathToExe, MAX_PATH);
RegisterMyProgramForStartup(L"My_Program", szPathToExe, L"-foobar");
}
int _tmain(int argc, _TCHAR* argv[])
{
RegisterProgram();
IsMyProgramRegisteredForStartup(L"My_Program");
return 0;
}
Как это выглядит? http://pastebin.com/U85ZSrnY –
Это не так. Вы должны вызвать 'RegQueryValueEx' после того, как вы вызвали' RegOpenKey'. Потому что вам нужно иметь ручку ключа. –
О, моя глупая ошибка, как насчет теперь лучше? http://pastebin.com/0guvBRfj –