我在 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;
}
输出是:
. . .
“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 线程”(0x129c) 已退出,代码为 0 (0x0)。 程序“[2492] SessionMonitor.exe: Native”已退出,代码为 0 (0x0)。
调试时,j 为 1063 - ERROR_FAILED_SERVICE_CONTROLLER_CONNECT
有没有人遇到过这个问题? 有什么解决办法吗?
谢谢你 锂铁
最佳答案
问题在于您在 visual studio 中启动服务。
这是不可能的。您只需使用 visual studio 编译该服务,然后使用 sc 命令(或以编程方式如 here 所述)在命令提示符下注册它。 this的接受答案中描述了所有正确的方法问题。
如果要调试服务代码,必须直接发出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
}
当 StartServiceCtrlDispatcher
失败并且 GetLastError
返回 ERROR_FAILED_SERVICE_CONTROLLER_CONNECT (1063)
关于windows - Windows 7 上的 StartServiceCtrlDispatcher 访问被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11649967/