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
问题在于您在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)
这是错误的:
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)