在非服务进程里读写注册表没有问题,把读写注册表的代码放到系统服务进程里就读写出错,是不是服务进程里没法操作注册表呢?我是这么创建服务的:
SC_HANDLE hService = ::CreateService(
hSCM, szServiceName, szServiceName,
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
szFilePath, NULL, NULL, _T(""), NULL, NULL);哪位大牛帮解答一下,谢谢啦!!!!

解决方案 »

  1.   

    没问题,你读写出错用GetLastError()捕获一下错误代码
      

  2.   


    HKEY keyRet;
    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,(unsigned short*)"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\Folder\\ClassicViewState"
    ,0,KEY_READ|KEY_WRITE,&keyRet)==ERROR_SUCCESS)
    {
    unsigned char value[256]={0};
    DWORD type=REG_SZ;
    DWORD size; if(RegQueryValueEx(keyRet,(unsigned short*)"{1C85E114}",NULL,&type,value,&size)==ERROR_SUCCESS)
    {
    string status = string((char*)value);
    if(status == "T")//注册了
    is_trial = false;
    else
    is_trial = true;
    }
    else
    LogEvent(_T("访问注册表项{1C85E114}出错!"));

    unsigned char times[256]={0};
    if(RegQueryValueEx(keyRet,(unsigned short*)"{2902A9F8}",NULL,&type,times,&size)==ERROR_SUCCESS)
    {
    string utime = string((char*)times);
    used_time = (atoi(utime.c_str())+100)/2;
    }
    else
    LogEvent(_T("访问注册表项{2902A9F8}出错!")); RegCloseKey(keyRet);
    }
    else
    LogEvent(_T("打开注册表出错!"));
    同样的代码在非服务进程里就能读写注册表,在服务进程里就报“打开注册表出错!"
    好奇怪
      

  3.   

    刚加了GetLastError函数,然后FormatMessage,输出的是“操作成功完成”, 这个很奇怪啊,如果操作成功完成了,应该是走if分支啊
      

  4.   

    服务程序读取HKEY_LOCAL_MACHINE注册表键值没问题的,你GetLastError加到哪里了?
      

  5.   


    HKEY keyRet;
    long ret;
    ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,(unsigned short*)"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\Folder\\ClassicViewState"
    ,0,KEY_READ|KEY_WRITE,&keyRet);
    if(ret==ERROR_SUCCESS)
    {
    。。
    }
    else
    {
     LPVOID lpMsgBuf;
     FormatMessage(
     FORMAT_MESSAGE_ALLOCATE_BUFFER |
     FORMAT_MESSAGE_FROM_SYSTEM |
     FORMAT_MESSAGE_IGNORE_INSERTS,
     NULL,
     GetLastError(),
     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
     (LPTSTR) &lpMsgBuf,
     0,
     NULL
     ); LogEvent(_T("%s"),(char*)lpMsgBuf);//此处为“操作成功完成”
    }
    如果ret==0的话才会操作成功完成
      

  6.   

        请注意,在vista以及WIN7的系统上,Service和应用程序执行的时候,使用的用户是不一样的。
         service是使用System用户运行的,而不是像应用程序一样,使用执行应用程序的user执行的。     其实,在vista和win7上使用服务的时候,还涉及到一个session穿透问题,不过,楼主这里应该还没遇到,所以也就不多说了。
      

  7.   

    “本地系统账户”登录,可以读HKEY_LOCAL_MACHINE了,但读不了HKEY_CURRENT_USER。