Windows 7上的StartServiceCtrlDispatcher访问被拒绝

lir*_*nda 4 windows service access-denied

我在Windows 7上的visual studio 2008中有一个c ++项目,我尝试启动一项新服务.我以管理员身份运行visual studio.我无法启动服务(甚至没有调用serviceMain).

这是我的主要功能:

wchar_t str[] = {'s','e','s','m'};

int _tmain(int argc, _TCHAR* argv[])
{
    SERVICE_TABLE_ENTRY dispTable[] =
    {
        {(wchar_t*)str, ServiceWork::ServiceMain}, 
        {NULL, NULL}
    };

    int i = StartServiceCtrlDispatcher(dispTable);
    int j = GetLastError();
    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

输出是:

...

'SessionMonitor.exe':已加载'C:\ Windows\SysWOW64\cryptbase.dll'

'SessionMonitor.exe':已加载'C:\ Windows\SysWOW64\imm32.dll'

'SessionMonitor.exe':已加载'C:\ Windows\SysWOW64\msctf.dll'

SessionMonitor.exe中0x7638b9bc的第一次机会异常:0x00000005:访问被拒绝.线程'Win32 Thread'(0x129c)已退出,代码为0(0x0).程序'[2492] SessionMonitor.exe:Native'已退出,代码为0(0x0).

在调试时,j是1063 - ERROR_FAILED_SERVICE_CONTROLLER_CONNECT

以前有人遇到过这个问题吗?任何解决方案

谢谢你,Liron

Zac*_*Zac 5

问题在于您在visual studio中启动服务.

这是不可能做到的.您必须使用visual studio编译服务,然后使用sc命令(或此处描述的programmarically )在命令提示符上注册它.所有正确的方法都在这个问题的公认答案中描述.

如果要调试服务代码,则必须直接发出ServiceMain,例如:

int _tmain(int argc, _TCHAR* argv[])
{
#ifdef AS_SERVICE
    SERVICE_TABLE_ENTRY dispTable[] =
    {
        {(wchar_t*)str, ServiceWork::ServiceMain}, 
        {NULL, NULL}
    };

    int i = StartServiceCtrlDispatcher(dispTable);
    int j = GetLastError();
    return 0;
#else
    ServiceMain(argc, argv);
#endif
}
Run Code Online (Sandbox Code Playgroud)

StartServiceCtrlDispatcher失败和GetLastError返回时也会出现同样的问题ERROR_FAILED_SERVICE_CONTROLLER_CONNECT (1063)


Har*_*ton 0

这是错误的:

wchar_t str[] = {'s','e','s','m'};
Run Code Online (Sandbox Code Playgroud)

您遗漏了终止 NUL。使用

wchar_t str[] = L"sesm";
Run Code Online (Sandbox Code Playgroud)