关于用VC写服务程序的一点小问题

Grim_Rapier 2013-11-18 05:38:24
请看以下程序:只列出主要函数的实现
#include <stdio.h>
#include <Windows.h>
#include <tchar.h>

TCHAR szServiceName[] = _T("MyTestService");
DWORD dwThreadID;
HANDLE hEvent = INVALID_HANDLE_VALUE;
SERVICE_STATUS status;
SERVICE_STATUS_HANDLE hServiceStatus;
void Init();
BOOL IsServiceInstalled();//TestService.exe /install
//TestService.exe /uninstall
BOOL InstallService();// Install service:
BOOL UninstallService();// Uninstall service:
BOOL ServiceCtrlStart();// Start service:
BOOL ServiceCtrlStop();// Stop service:
void WINAPI ServiceMain();
void WINAPI ServiceStrl(DWORD dwOpcode);
void LogEvent(LPCTSTR pszFormat, ...);
int main( int argc, char* argv[] )
{
Init();
dwThreadID = ::GetCurrentThreadId();
SERVICE_TABLE_ENTRY st[] =
{
{ szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
{ NULL, NULL }
};
LPSTR lpCmdLine = argv[1];
if ( argc == 2 )
{
BOOL bRet;
if (stricmp(lpCmdLine, "/install") == 0)
{
bRet = InstallService();
if ( bRet == TRUE )
{
printf( "Install service %s success", szServiceName );
}else
{
printf( "Install service %s failed", szServiceName );
}
}
else if (stricmp(lpCmdLine, "/uninstall") == 0)
{
bRet = UninstallService();
if ( bRet == TRUE )
{
printf( "Uninstall service %s success", szServiceName );
}else
{
printf( "Uninstall service %s failed", szServiceName );
}
}else if (stricmp(lpCmdLine, "/start") == 0)
{
bRet = ServiceCtrlStart();
if ( bRet == TRUE )
{
printf( "Start service %s success", szServiceName );
}else
{
printf( "Start service %s failed", szServiceName );
}
}else if (stricmp(lpCmdLine, "/stop") == 0)
{
bRet = ServiceCtrlStop();
if ( bRet == TRUE )
{
printf( "Stop service %s success", szServiceName );
}else
{
printf( "Stop service %s failed", szServiceName );
}
}
else
{
if (!::StartServiceCtrlDispatcher(st))
{
LogEvent(_T("Register Service Main Function Error!"));
}
}
}else
{
if (!::StartServiceCtrlDispatcher(st))
{
LogEvent(_T("Register Service Main Function Error!"));
}
}
return 0;
}
//服务主线程函数,即用户选择开启服务时调用的函数
void WINAPI ServiceMain()
{
// Register the control request handler
status.dwCurrentState = SERVICE_START_PENDING;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
LogEvent(_T("ServiceMain"));
//注册服务控制
hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl);
if (hServiceStatus == NULL)
{
LogEvent(_T("Handler not installed"));
return;
}
SetServiceStatus(hServiceStatus, &status);
//如下代码可以为启动服务前的准备工作
hEvent = ::CreateEvent( NULL, TRUE, FALSE, NULL );
if ( hEvent == NULL )
{
status.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hServiceStatus, &status);
LogEvent(_T("Failure to start service"));
return;
}
//
//更改服务状态为启动
status.dwWin32ExitCode = S_OK;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
status.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(hServiceStatus, &status);
//等待用户选择停止服务,
//当然你也可以把你的服务代码用线程来执行,
//此时这里只需等待线程结束既可。
while ( WaitForSingleObject( hEvent, 1000 ) != WAIT_OBJECT_0 )
{
//模拟服务的运行,应用时将主要任务放于此即可
LogEvent(_T("Service runing..."));
::ShellExecute(NULL,"open","notepad.exe",NULL,NULL,SW_SHOW);//测试程序
}
//
//停止服务
status.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hServiceStatus, &status);
LogEvent(_T("Service stopped"));
}
为测试程序,我在servicemain()中写了::ShellExecute(NULL,"open","notepad.exe",NULL,NULL,SW_SHOW);
所以服务启动后会打开记事本,但是安装,启动服务都成功后,并未执行记事本程序,即没有执行servicemain()函数,原因何在?
...全文
248 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
版主大哥 2013-11-20
  • 打赏
  • 举报
回复
打日志是跟踪好方法... 提供一个好方法: 在void WINAPI ServiceMain()中用一个sleep(5000)或者更久,在sleep后加断点,运行服务,用debug attach 服务进程,等着到断点,实时调试看看
oyljerry 2013-11-20
  • 打赏
  • 举报
回复
引用 3 楼 pq159753159 的回复:
[quote=引用 2 楼 oyljerry 的回复:] 写Log吧,或者查看任务管理器,服务的exe是否启动 服务启动的记事本在不同session,你看不到的
查看services.msc服务已经启动,作为测验,在servicemain()放个消息框但并未显示,意味着程序好像没有走到servicemain()[/quote] 消息框一样的看不见,你还是打印Log来看代码走到哪了
Grim_Rapier 2013-11-19
  • 打赏
  • 举报
回复
引用 2 楼 oyljerry 的回复:
写Log吧,或者查看任务管理器,服务的exe是否启动 服务启动的记事本在不同session,你看不到的
查看services.msc服务已经启动,作为测验,在servicemain()放个消息框但并未显示,意味着程序好像没有走到servicemain()
oyljerry 2013-11-18
  • 打赏
  • 举报
回复
写Log吧,或者查看任务管理器,服务的exe是否启动 服务启动的记事本在不同session,你看不到的
zgl7903 2013-11-18
  • 打赏
  • 举报
回复
看看日志是否运行到了这里? 看ShellExecute返回什么值?

2,641

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧