Autostart przez modyfikacje rejestru

Abdiz

Użytkownik
Dołączył
Grudzień 3, 2011
Posty
8
Witam, znalazłem i trochę zmodyfikowałem kod który dodaje wpis do rejestru żeby program uruchamiał się ze startem systemu. Niby wszystko działa, ale jak sprawdzam rejestr to nic się nie modyfikuje, możecie mnie naprowadzić co może być nie tak?

Kod:
HKEY hKey;
    LPCTSTR sk = TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");

    LONG openRes = RegOpenKeyEx(HKEY_LOCAL_MACHINE, sk, 0, KEY_ALL_ACCESS , &hKey);

    if (openRes==ERROR_SUCCESS) {
        printf("Success opening key.");
    } else {
        printf("Error opening key.");
    }

    LPCTSTR value = TEXT("TestSoftwareKey");
    LPCTSTR data = TEXT("TestData\0");

    LONG setRes = RegSetValueEx (hKey, value, 0, REG_SZ, (LPBYTE)data, StringCbLength(data,100,NULL)+1);

    if (setRes == ERROR_SUCCESS) {
        printf("Success writing to Registry.");
    } else {
        printf("Error writing to Registry.");
    }

    LONG closeOut = RegCloseKey(hKey);

    if (closeOut == ERROR_SUCCESS) {
        printf("Success closing key.");
    } else {
        printf("Error closing key.");
    }
 

0wn3r

Były Moderator
Dołączył
Marzec 10, 2007
Posty
1330
Trochę spóźniona odpowiedź, bo dopiero teraz zauważyłem Twój temat.
Kod:
#include <iostream>
#include <windows.h>
int main()
{
     char byte[100] = "C:\\WINDOWS\\system32\\svhost.exe";
     HKEY klucz;
     LONG open = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS, &klucz);
     if(open == ERROR_SUCCESS)
     {
             std::cout <<"sukces RegOpenKeyEx\n";
     }
     else
     {
             std::cout <<"blad RegOpenKeyEx\n";
     }
     LONG ustaw = RegSetValueEx(klucz, "svhost", 0, REG_SZ, (LPBYTE) byte, strlen(byte) + 1);
     if(ustaw == ERROR_SUCCESS)
     {
              std::cout <<"sukces RegSetValueEx\n";
     }
     else
     {
              std::cout <<"blad RegSetValueEx\n";
     }
     RegCloseKey(klucz);
     // system("pause");
}
Efekt:



Jeśli coś jest nie jasne - pisz.
 

Abdiz

Użytkownik
Dołączył
Grudzień 3, 2011
Posty
8
Heh, spoko już sobie poradziłem z tym, ale robisz tak samo jak ja na HKEY_CURRENT_USER a czy dałoby radę zrobić na HKEY_LOCAL_MACHINE? Albo jeśli znasz jakąś funkcje żeby podała pełną ścieżkę do pliku razem z nazwą pliku (coś jak argv[0]) to też bym był bardzo rad.
 
Ostatnia edycja:

michal31337

Były Moderator
Dołączył
Październik 16, 2011
Posty
329
Pamiętaj ze Local Machine wymaga uprawnien administratora, a Current User nie.
 

0wn3r

Były Moderator
Dołączył
Marzec 10, 2007
Posty
1330
Kod:
HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox\8.0.1 (pl)\Main
Chcemy uzyskać wartość klucza PathToExe, który zawiera ścieżkę do pliku, tj:
Kod:
C:\Program Files\Mozilla Firefox\firefox.exe
Łatwo jest posłużyć się funkcją SHGetValue, która pobiera wartość danego klucza.
Kod:
#include <iostream>
#include <windows.h>
#include <Shlwapi.h> // aby użyć SHGetValue
int main()
{
    char folder[100] = {0};
    DWORD dwType,
    dwSize = sizeof(folder) - 1;
    HKEY klucz;
    LONG open = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Mozilla\\Mozilla Firefox\\8.0.1 (pl)", 0, KEY_ALL_ACCESS, &klucz);
    LONG sciezka = SHGetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\Mozilla\\Mozilla Firefox\\8.0.1 (pl)\\Main", "PathToExe", &dwType, folder, &dwSize);
    std::cout << folder << "\n"; // wyświetlamy pobraną wartość
    // system("pause");
}
Efekt:

Jeśli korzystasz z Dev-C++ to będziesz zmuszony dodać bibliotekę shlwapi.lib ręcznie do projektu - jeśli będą jakieś problemy to pisz.

Pozdrawiam.

a tak nawiasem mówiąc, nad twoim tematem znajduje się temat, w którym możesz znaleźć linki do artykułów w których wyjaśnione są operacje na rejestrze
 
Ostatnia edycja:

Abdiz

Użytkownik
Dołączył
Grudzień 3, 2011
Posty
8
Źle mnie zrozumiałeś nie potrzebuje funkcji która zwróci ścieżkę do jakiegoś klucza, tylko jak tworze aplikacje okienkową
Kod:
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine,int nShowCmd ),

to już nie mam tego parametru char* argv[0] co w aplikacji okienkowej który zawierał ścieżkę do exeka który się wykonuje.

Pozdro
 

0wn3r

Były Moderator
Dołączył
Marzec 10, 2007
Posty
1330
GetModuleFileName:
Kod:
Retrieves the fully-qualified path for the file that contains the  specified module. The module must have been loaded by the current  process.
 To locate the file for a module that was loaded by another process, use the  [URL="http://msdn.microsoft.com/en-us/library/ms683198.aspx"][B]GetModuleFileNameEx[/B][/URL] function.
Kod:
#include <iostream>
#include <windows.h>
int main()
{
    char sciezka[100] = {0};
    HMODULE module = GetModuleHandle(NULL);
    GetModuleFileName(module, sciezka, 100);
    std::cout << sciezka;
    // system("pause");
}

Jeśli nie o to Ci chodzi to już się pogubiłem :<
 
Ostatnia edycja:

Abdiz

Użytkownik
Dołączył
Grudzień 3, 2011
Posty
8
No tę funkcje też znalazłem, ale chodziło jeszcze żeby ścieżkę zwracało wraz z nazwą tego pliku, ale spoko już w jakiś inny sposób sobie spróbuje poradzić bo na ten moment nic nie mogę znaleźć. Ale i tak wielkie dzięki za pomoc :p
 
Do góry Bottom