使用服务时C ++读取注册表失败,但在控制台中成功

喘气

程序启动后,我必须阅读一些注册表值。如果代码是从Command提示符下编译并运行的,则代码可以正常工作并提供我寻求的注册表值。但是,如果我创建服务并将exe附加到使用以下代码的服务:

sc create someservice start=auto binpath= "PATH to EXE of Code"

并运行该服务,我没有得到期望的价值。我已经附上了完整的代码。我也记录了每个步骤的结果。

#include <Windows.h>
#include <iostream>
#include <string>

SERVICE_STATUS ServiceStatus; 
SERVICE_STATUS_HANDLE hStatus; 

int WriteToLog(const char *);
std::string GetLPInstalledPath();

std::string GetLPInstalledPath()
    {
        HKEY hKey;
        char buf[255];
        DWORD dwType;
        DWORD dwBufSize = sizeof(buf);
        std::string ss="";
        const char* subkey = "Software\\\\Logpoint\\\\InstalledPath";
        WriteToLog(" Inside GetLPInstalledPath") ;
        if( RegOpenKey(HKEY_CURRENT_USER,subkey,&hKey) == ERROR_SUCCESS)
        {
            WriteToLog("Opened the Registry Key");
        dwType = REG_SZ;
        if( RegQueryValueEx(hKey,"path",0, &dwType, (BYTE*)buf, &dwBufSize) == ERROR_SUCCESS)
        {
        ss = buf;       
        WriteToLog(ss.c_str());
        }
        else
        {
        WriteToLog(" Cound not find the value");

        }           
        RegCloseKey(hKey);
        }
        else
        {
            WriteToLog(" Cannot Open the Installed Registry Path");

        }

        return ss;
    }

int WriteToLog(const char* str)
{
    //const char *logfile = "D:\\ubuntu_share\\lpa\\lpa_c\\build_win\\src\\lpa\\sample.txt";
    FILE* log;
    log = fopen("C:\\lpa\\sample.txt", "a+");
    if (log == NULL)
        return -1;
    fprintf(log, "%s\n", str);
    fclose(log);
    return 0;
}

int Run()
{
    WriteToLog("Run");
    WriteToLog("entering infinite loop of main thread ");
    while(1);
    WriteToLog("end of main thread ");
    return 0;
}

void ControlHandler(DWORD request) 
{ 
    //LOG4CPLUS_INFO(root,  "ControlHandler: Entry";
    switch(request) 
    { 
        case SERVICE_CONTROL_STOP: 
            //WriteToLog("Monitoring stopped.");
            WriteToLog( "ControlHandler: SERVICE_CONTROL_STOP Request");
            ServiceStatus.dwWin32ExitCode = 0; 
            ServiceStatus.dwCurrentState  = SERVICE_STOPPED; 
            if(SetServiceStatus (hStatus, &ServiceStatus)==FALSE)
            {
                WriteToLog("ServiceCtrlHandler: SetServiceStatus returned error");
            }
            return; 

        case SERVICE_CONTROL_SHUTDOWN: 
           // WriteToLog("Monitoring shutdown.");
            WriteToLog("ControlHandler: SERVICE_CONTROL_SHUTDOWN Request");
            ServiceStatus.dwWin32ExitCode = 0; 
            ServiceStatus.dwCurrentState  = SERVICE_STOPPED; 
            if(SetServiceStatus (hStatus, &ServiceStatus) == FALSE)
            {
                WriteToLog("ServiceCtrlHandler: SetServiceStatus returned error");
            }
            return; 

        case SERVICE_CONTROL_INTERROGATE:
            return;
        default:
            WriteToLog("ServiceCtrlHandler");
            break;
    } 

    // Report current status
    SetServiceStatus (hStatus,  &ServiceStatus);
    WriteToLog("ServiceCtrlHandler: Exit");
    return; 
} 

void ServiceMain(int argc, char** argv) 
{ 
    //WriteToLog("at ServiceMain");
    WriteToLog("ServiceMain");
    int error; 

    ServiceStatus.dwServiceType        = SERVICE_WIN32; 
    ServiceStatus.dwCurrentState       = SERVICE_START_PENDING; 
    ServiceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
    ServiceStatus.dwWin32ExitCode      = 0; 
    ServiceStatus.dwServiceSpecificExitCode = 0; 
    ServiceStatus.dwCheckPoint         = 0; 
    ServiceStatus.dwWaitHint           = 0; 

    hStatus = RegisterServiceCtrlHandler(
        "MemoryStatus", 
        (LPHANDLER_FUNCTION)ControlHandler); 
    if (hStatus == NULL) 
    { 
        // Registering Control Handler failed
        WriteToLog("ServiceMain: RegisterServiceCtrlHandler returned error");
        return; 
    }  

    // We report the running status to SCM. 
    ServiceStatus.dwCurrentState = SERVICE_RUNNING; 
    if(SetServiceStatus (hStatus, &ServiceStatus)==FALSE)
    {
        WriteToLog("ServiceMain: SetServiceStatus returned error");
    }

    WriteToLog("ServiceMain: Performing Service Start Operations");
    Run();
    WriteToLog("ServiceMain: Performing Cleanup Operations");
    ServiceStatus.dwControlsAccepted = 0;
    ServiceStatus.dwCurrentState = SERVICE_STOPPED;
    ServiceStatus.dwWin32ExitCode = 0;
    ServiceStatus.dwCheckPoint = 3;

    if (SetServiceStatus (hStatus, &ServiceStatus) == FALSE)
    {
        WriteToLog("ServiceMain: SetServiceStatus returned error");
    }
    WriteToLog("ServiceMain: Exit");
    return; 
}


int StartLpaService()
{

    SERVICE_TABLE_ENTRY ServiceTable[2];
    ServiceTable[0].lpServiceName = "MemoryStatus";
    ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;

    ServiceTable[1].lpServiceName = NULL;
    ServiceTable[1].lpServiceProc = NULL;
    // Start the control dispatcher thread for our service
    if(StartServiceCtrlDispatcher(ServiceTable)  == FALSE)
    {
        WriteToLog("StartLpaService: StartServiceCtrlDispatcher returned error");
        return GetLastError ();
    }
    WriteToLog("Main: Exit");
    return 0;
}

int main(int argc, char **argv)
{ 
    std::string pa = GetLPInstalledPath();
#ifdef SERVICE_DEBUG
    WriteToLog("SERVICE_DEBUG");
    Sleep(15000);
#endif
    StartLpaService();
    return 0;
}

我面临的问题是,如果启动了程序的服务,则不会写入任何注册表值,但是直接从命令提示符运行会给出该值。我该如何解决这个问题?

大卫·赫弗南(David Heffernan)

您正在中查找HKCU当前用户的注册表配置单元。因此,对于您所描述的内容,最合理的解释只是该服务在其他用户下运行。也就是说,该服务在交互式用户以外的其他用户帐户下运行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我正在尝试使用wso2中的MySQL 5.9.0更改我的注册表数据库,并按照以下步骤进行操作,但控制台中未显示该数据库?

来自分类Dev

从注册表C#读取值

来自分类Dev

从注册表C#读取值

来自分类Dev

从私有注册表中提取图像时,docker swarm 创建服务失败

来自分类Dev

在控制台中输入时,systemctl可以工作,但在服务器引导时不起作用

来自分类Dev

如何注册Windows服务,但避免在服务控制台中列出该服务?

来自分类Dev

C ++-从注册表读取值中获取空值

来自分类Dev

C#如何从注册表中读取MultiString

来自分类Dev

使用Powershell递归读取注册表设置

来自分类Dev

Chrome Inspector中的Javascript调试:变量未在手表和控制台中显示,但在悬停时可以检查

来自分类Dev

从 Azure Kubernetes 服务使用 Azure 容器注册表进行身份验证时的问题

来自分类Dev

jQuery事件在用代码编写时不会触发,但在控制台中编写时会触发

来自分类Dev

厨师管理器中缺少角色,但在控制台中列出角色时显示

来自分类Dev

jQuery事件在用代码编写时不会触发,但在控制台中编写时会触发

来自分类Dev

contains() 和 Replace() 在控制台中工作,但在运行脚本时不起作用

来自分类Dev

为什么此代码在控制台中有效,但在页面加载时无效?

来自分类Dev

使用 jenkins 在 GitLab 注册表中推送图像时,错误失败:存储库名称无效

来自分类Dev

JSNI 脚本失败,但在 Chrome Devtools 控制台中运行时脚本成功

来自分类Dev

使用getRuntime()。exec(cmd)更改注册表项的值不会更改注册表值,即使操作成功结束

来自分类Dev

使用getRuntime()。exec(cmd)更改注册表项的值不会更改注册表值,即使操作成功结束

来自分类Dev

C ++ Python模块在Blender中崩溃,但在Python控制台中未崩溃

来自分类Dev

C++ 没有在 Xcode 控制台中显示 cout,但在终端中完美运行

来自分类Dev

无法在C#中使用PowerShell读取注册表值

来自分类Dev

在 Web 控制台中工作时,oc rollout 从命令行失败。如何调查?

来自分类Dev

JPA 查询验证在子选择时失败,即使它在控制台中工作

来自分类Dev

使用xsbt-web-plugin时,为什么在Sbt控制台中检查compile:packageWar :: packagedArtifact失败?

来自分类Dev

使用Laravel的注册表

来自分类Dev

在某些情况下尝试从服务内部修改注册表失败?

来自分类Dev

在控制台中执行时,单击时的jQuery起作用,但在页面加载时不起作用

Related 相关文章

  1. 1

    我正在尝试使用wso2中的MySQL 5.9.0更改我的注册表数据库,并按照以下步骤进行操作,但控制台中未显示该数据库?

  2. 2

    从注册表C#读取值

  3. 3

    从注册表C#读取值

  4. 4

    从私有注册表中提取图像时,docker swarm 创建服务失败

  5. 5

    在控制台中输入时,systemctl可以工作,但在服务器引导时不起作用

  6. 6

    如何注册Windows服务,但避免在服务控制台中列出该服务?

  7. 7

    C ++-从注册表读取值中获取空值

  8. 8

    C#如何从注册表中读取MultiString

  9. 9

    使用Powershell递归读取注册表设置

  10. 10

    Chrome Inspector中的Javascript调试:变量未在手表和控制台中显示,但在悬停时可以检查

  11. 11

    从 Azure Kubernetes 服务使用 Azure 容器注册表进行身份验证时的问题

  12. 12

    jQuery事件在用代码编写时不会触发,但在控制台中编写时会触发

  13. 13

    厨师管理器中缺少角色,但在控制台中列出角色时显示

  14. 14

    jQuery事件在用代码编写时不会触发,但在控制台中编写时会触发

  15. 15

    contains() 和 Replace() 在控制台中工作,但在运行脚本时不起作用

  16. 16

    为什么此代码在控制台中有效,但在页面加载时无效?

  17. 17

    使用 jenkins 在 GitLab 注册表中推送图像时,错误失败:存储库名称无效

  18. 18

    JSNI 脚本失败,但在 Chrome Devtools 控制台中运行时脚本成功

  19. 19

    使用getRuntime()。exec(cmd)更改注册表项的值不会更改注册表值,即使操作成功结束

  20. 20

    使用getRuntime()。exec(cmd)更改注册表项的值不会更改注册表值,即使操作成功结束

  21. 21

    C ++ Python模块在Blender中崩溃,但在Python控制台中未崩溃

  22. 22

    C++ 没有在 Xcode 控制台中显示 cout,但在终端中完美运行

  23. 23

    无法在C#中使用PowerShell读取注册表值

  24. 24

    在 Web 控制台中工作时,oc rollout 从命令行失败。如何调查?

  25. 25

    JPA 查询验证在子选择时失败,即使它在控制台中工作

  26. 26

    使用xsbt-web-plugin时,为什么在Sbt控制台中检查compile:packageWar :: packagedArtifact失败?

  27. 27

    使用Laravel的注册表

  28. 28

    在某些情况下尝试从服务内部修改注册表失败?

  29. 29

    在控制台中执行时,单击时的jQuery起作用,但在页面加载时不起作用

热门标签

归档