Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Добавление в автозаргрузку (реестр)


Автор: lamber 12.7.2011, 17:19
Провозился час с чем-то не могу понять в чем дело, вроде все делаю правильно, но ключ так и не записывается в реестр посмотрите что делаю не так. Тестил на Win7

Код

    HKEY Key;
    if((RegOpenKeyExA(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_ALL_ACCESS,&Key)==ERROR_SUCCESS))
    {
        RegSetValueExA(Key,"test",0,REG_SZ,(const BYTE*)"C:\\test.exe",strlen("C:\\test.exe")+1);
        RegCloseKey(Key);
        return true;
    }
    return false;

Автор: xvr 12.7.2011, 19:26
Запись в HKEY_LOCAL_MACHINE это привилегированное действие. Непонятно, как у вас вообще RegOpenKeyExA отработала. Проверьте, что возвращает RegSetValueExA


Автор: ASMatic 12.7.2011, 21:01
lamber,  GetLastError() нужно юзать....хотя бы его и не будет дурацких вопросов)

Автор: lamber 12.7.2011, 23:01
Проверял RegSetValueExA тоже возвращает ERROR_SUCCESS. Осталось протестить GetLastError

Автор: volatile 12.7.2011, 23:27
У 7 есть одна нехорошая вещь, она виртуализирует некоторые пути на диске, и некоторые ветки реестра.
так что ошибки может не быть, просто она запишет не туда куда вы пишите, а в виртуальную ветку.

Не гарантирую что это именно так, но вероятность есть.


Автор: GremlinProg 13.7.2011, 06:48
на x64 машине ветка SOFTWARE при эмуляции x86 редиректится в ветку SOFTWARE/Wow6432Node, так что, ежели надо записать раздел для 64-разрядных приложений, надо компилировать 64-разрядный образ, либо использовать правильный контекст вызова: http://msdn.microsoft.com/en-us/library/aa393067(v=vs.85).aspx

Автор: lamber 13.7.2011, 11:38
2volatile и 2GremlinProg

Истинна где-то у вас т.к. GetLastError() возвращает 0, но значения не установливаются и не читаются значения из реестра. GremlinProg машина и правда x64, не поможешь переделать под код который я привел т.к. я не совсем понял что требуется сделать в той ссылке что ты привел. volatile как проверить твое предположение ?

Автор: xvr 13.7.2011, 11:44
Смотрите http://msdn.microsoft.com/en-us/library/aa965884%28v=VS.85%29.aspxи http://msdn.microsoft.com/en-us/library/ms724072%28v=VS.85%29.aspx

Автор: GremlinProg 13.7.2011, 12:02
Цитата(lamber @  13.7.2011,  13:38 Найти цитируемый пост)
я не совсем понял что требуется сделать в той ссылке что ты привел

по ссылке внизу есть несколько примеров работы с реестром через OLE, с возможностью явно указать платформу
их можно портировать на C/C++

но в С/C++ для этой реализации потребуется многобукв, попробуй пока более простой вариант: если используется Visual Studio, то в Active Solution Platform выбери x64 и перекомпилируй проект (в vs, отличной от 2010 возможно потребуется эту платформу дополнительно создать)

Автор: lamber 13.7.2011, 13:42
Сенкс вы очень крутые типы))) Действительно Win 7 все перекидывает в ветку WoW6432Node

Привожу рабочий код 

Код

    HKEY Key;
    if((RegOpenKeyExA(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_ALL_ACCESS | KEY_WOW64_64KEY,&Key)==ERROR_SUCCESS))
    {
        RegSetValueExA(Key,"test",0,REG_SZ,(const BYTE*)"C:\\test.exe",strlen("C:\\test.exe")+1);
        RegCloseKey(Key);
        return true;
    }
    return false;


Как видно из кода нужно всего лишь добавить соответствующий ключ KEY_WOW64_64KEY и все будет)))
Спасибо всем кто откликнулся.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)