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


Автор: N0rt0N 22.5.2007, 20:19
Есть один заголовочный файл autorun.h который должен добавлять программу в автозагрузку. Но эта функция почему-то не выполняется :( Вот код этого файла:
Код

#define BUFF 0xFF
//-----------------------------------------------------------------
BOOL HKEYRecord        (char str[BUFF]);
BOOL MAKEService    (char str[BUFF]);
//-----------------------------------------------------------------
BOOL AddIntoSystem(char recname[BUFF], int type){
    if(type){
        if(MAKEService(recname)){
            return TRUE;
        }else{
            return FALSE;
        }
    }else{
        if(HKEYRecord(recname)){
            return TRUE;
        }else{
            return FALSE;
        }
    }
}
//-----------------------------------------------------------------
BOOL HKEYRecord(char recname[BUFF]){ 

    char str[BUFF];
    char tmpbuf[BUFF];
    char sysbuf[BUFF];

    GetModuleFileName(GetModuleHandle(NULL), str, BUFF);
    GetSystemDirectory(sysbuf, BUFF);
    strcat(sysbuf, "\\");
    strcat(sysbuf, MY_MACRO_RECORD_NAME);
    strcat(sysbuf, ".exe\0");
    CopyFile(str, sysbuf, true);
    HKEY rechk;
    RegCreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", &rechk);
    RegSetValueEx(rechk, (LPCSTR)recname, 0, REG_SZ, (LPBYTE)sysbuf, (DWORD)strlen(sysbuf)+1);
    RegCloseKey(rechk);
    delete(str, tmpbuf, sysbuf);
return TRUE;
}
//-----------------------------------------------------------------
BOOL MAKEService(char recname[BUFF]){

    char        str[BUFF];
    char        servicedir[BUFF];
    SC_HANDLE    servman;
    SC_HANDLE    service;

    GetModuleFileName(GetModuleHandle(NULL), str, BUFF);
    GetSystemDirectory(servicedir, BUFF);
    strcat(servicedir, "\\");
    strcat(servicedir, recname);
    strcat(servicedir, ".exe\0");
    if(!FileExist(servicedir)){
        CopyFile(str, servicedir, true);
        servman = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
        if(servman != NULL){
            service = CreateService(servman, MY_MACRO_SERVICE_NAME, MY_MACRO_SERVICE_NAME, 0, SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, servicedir, NULL, NULL, NULL, NULL, NULL);
            if(service != NULL){
                CloseServiceHandle(service);
                return TRUE;
            }
            CloseServiceHandle(service);
            return FALSE;
        }else{
            return FALSE;
        }
    }
    return FALSE;
}



Я так понял, что функция HKEYRecord() и должна осуществлять запись в реестр. Но почему-то не делает этого. Может быть кто нибудь может подсказать почему?
Заранее спасибо.

Автор: jonie 22.5.2007, 22:38
потому что неработает?
может нет прав вообще на запись....
вот к примеру рабочий код для авторегистрирования себя любимого... (вырезка)... вот и сравнивайте)...
Код

........
if(RegOpenKeyExW(HKEY_LOCAL_MACHINE,L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_ALL_ACCESS,&hkLMR) != ERROR_SUCCESS){
        /* ошибка */
    }
    HKEY hkAUTO=0;
    char filename[MAX_PATH];
    int len = GetModuleFileName(GetModuleHandle(NULL),filename,MAX_PATH);
    if(RegSetValueEx(hkLMR,"somename",0,REG_SZ,(BYTE*)filename,len)!=ERROR_SUCCESS){
        /* ошибка */
        }
.........

Автор: -Kp0T- 23.5.2007, 11:10
Цитата(jonie @ 22.5.2007,  20:38)
потому что неработает?
может нет прав вообще на запись....
вот к примеру рабочий код для авторегистрирования себя любимого... (вырезка)... вот и сравнивайте)...
Код

........
if(RegOpenKeyExW(HKEY_LOCAL_MACHINE,L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_ALL_ACCESS,&hkLMR) != ERROR_SUCCESS){
        /* ошибка */
    }
    HKEY hkAUTO=0;
    char filename[MAX_PATH];
    int len = GetModuleFileName(GetModuleHandle(NULL),filename,MAX_PATH);
    if(RegSetValueEx(hkLMR,"somename",0,REG_SZ,(BYTE*)filename,len)!=ERROR_SUCCESS){
        /* ошибка */
        }
.........

 Все работает (и RegOpenKeyExW и RegOpenKeyExA). Странный у тя баг. Попробуй GetLastError(), что выдаст...

Автор: Dude03 23.5.2007, 20:49
Код

RegCreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", &rechk);

RegOpenKeyEx

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