Autostart Rejestr

0

Witam.Chciałbym dodać swój programik do tych uruchamianych wraz ze startem systemu.Tylko za pomocą rejestru ,a nie autostart.Umieszczam na początku kodu takie linijki :

HKEY hkey;
	RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", &hkey);
	RegSetValueEx(hkey, "Monitoring", 0, REG_SZ, (const BYTE*)"C:\\Monitoring.exe", 18); 

Niestety program wtedy się nie kompiluje i wyrzuca takie błędy:

 1>------ Build started: Project: wintoolsdeb, Configuration: Debug Win32 ------
1>  wintoolsdeb.cpp
1>c:\users\michal\desktop\etapy\wintoolsdeb\wintoolsdeb\wintoolsdeb.cpp(50): error C2664: 'LSTATUS RegOpenKeyW(HKEY,LPCWSTR,PHKEY)' : cannot convert argument 2 from 'const char [46]' to 'LPCWSTR'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>c:\users\michal\desktop\etapy\wintoolsdeb\wintoolsdeb\wintoolsdeb.cpp(51): error C2664: 'LSTATUS RegSetValueExW(HKEY,LPCWSTR,DWORD,DWORD,const BYTE *,DWORD)' : cannot convert argument 2 from 'const char [11]' to 'LPCWSTR'
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
0

Jest wyraźnie napisane co popsułeś. const char* to nie LPCWSTR. Poprzedź przekazywane stringi literą L, np:

 L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run" 

.

0

Dzięki, program się kompiluje, ale nadal nie uruchamia się przy starcie systemu.
Tak zmodyfikowałem te linijki basenu:

HKEY hkey;
	RegOpenKey(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", &hkey);
	RegSetValueEx(hkey, L"wintoolsdeb", 0, REG_SZ, (const BYTE*)L"C:\\test\\wintoolsdeb.exe", 18); 
0

to 18 na końcu jest lipne. powinna być długość stringa wraz z końcowym znakiem \0.

zamiast zrobić dobrze, dałeś stałą, a potem zmieniłeś stringa.

const wchar_t value[] = L"C:\\test\\wintoolsdeb.exe";
RegSetValueEx(..., value, sizeof(value));
0

To jeszcze raz, proszę mi podać co mam zastąpić obecnymi linijkami kodu, bo tyle już kombinowałem ,że aż się pogubiłem.

0
omis66 napisał(a):

Dzięki, program się kompiluje, ale nadal nie uruchamia się przy starcie systemu.
Tak zmodyfikowałem te linijki basenu:

HKEY hkey;
	RegOpenKey(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", &hkey);
	RegSetValueEx(hkey, L"wintoolsdeb", 0, REG_SZ, (const BYTE*)L"C:\\test\\wintoolsdeb.exe", 18); 

Troche za dużo pozmieniałeś. Przeczytaj co przyjmuje funkcja RegSetValueEx: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724923(v=vs.85).aspx
(W szczególności przedostatni argument ma być tablicą bajtów, a nie wcharów)

0

Okej, ale ja już nic nie chce zmieniać.Zależy mi ,żebyście podali mi gotową funkcję ,żebym nic już nie kombinował.Wszedłem na tą stronkę i nic gotowego nie znalazłem :).

0

Zniechęcasz do pomocy

0

Po prostu wydaje mi się ,że dla osób ,które się znają łatwiej będzie podanie tych dwóch linijek kodu ,niż szukanie błędu i tłumaczenie mi. Poza tym mi też łatwiej będzie sobie przyswoić widząc coś dobrego, niż uczyć się błędów.

0

To jest to niżej prawda ? Mi chodzi o coś krótkiego 3 linijki ,bo wiem ,że się tak da ,a nie kod ,który sprawdza poprawności i zwraca dane.

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;
} 
0

Panie masz Pan całą gotową fajną funkcję **RegisterProgram ** czego chcieć więcej? Lepszego gotowca nie wywalczysz. Dodatkowo jeżeli jednak będziesz chciał coś zrozumieć z tego to w linku, który wcześniej podałem kolega z SO wszystko fajnie wytłumaczył.

0
TCHAR szPath[MAX_PATH];
	GetModuleFileName(NULL, szPath, MAX_PATH);
	HKEY newValue;
	RegOpenKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", &newValue);
	RegSetValueEx(newValue, L"myprogram", 0, REG_SZ, (LPBYTE)szPath, sizeof(szPath));
	RegCloseKey(newValue); 

O takie coś mi szefie chodziło :)
Dzięki wszystkim za pomoc.Temat do zamknięcia :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1