hur.cn - 华软网

 热门搜索

服务程序的MESSAGEBOX问题

  作者:未知    来源:网络    更新时间:2011/8/26
void WINAPI ServiceMain()
{
  // Register the control request handler
  status.dwCurrentState = SERVICE_START_PENDING;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP;

//注册服务控制
  hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl);
  if (hServiceStatus == NULL)
  {
  LogEvent(_T("Handler not installed"));
  return;
  }
  SetServiceStatus(hServiceStatus, &status);

  status.dwWin32ExitCode = S_OK;
  status.dwCheckPoint = 0;
  status.dwWaitHint = 0;
status.dwCurrentState = SERVICE_RUNNING;//
SetServiceStatus(hServiceStatus, &status);

//模拟服务的运行,10后自动退出。应用时将主要任务放于此即可
FILE *stream;
  char list[30] = {0};
  int numread, numwritten;
while (!bStop)//
{

// Open file in text mode:
if( (stream = fopen( "C:\\fread.txt", "a" )) != NULL )
{
strcpy(list,"test");
numwritten = fwrite(list, sizeof(char), 20, stream);
fclose( stream );
}
MessageBox(NULL, _T("StartSev"), szServiceName, MB_OK);
Sleep(1000);
}




为什么添上MessageBox的时候不能弹出MessageBox呢?也只写了一次test。我把fread.txt删了之后也不重新生成,任务管理器中ServiceText.exe也在运行





我把MessageBox注释掉,重新运行他就会一直写test,就正常了
 

---华软 网友回答---
可以把服务设成交互式的恶,但这是下策,不应该在服务程序中做界面
---华软网友回复---
我只是问下原因?并不是一定要做界面,测试下,我在VC自己生成的ATL下MESSAGEBOX,一点问题都没有。
第一次要写 WINDOWS服务
不懂原理,从网上DOWN了一个下来,在其中插入MESSAGEBOX出了问题,我把代码附上,高手帮帮分析下原因…………这是完全代码~

#include "stdafx.h"
#include "stdio.h"
#include "tchar.h"
#include "string.h"

//定义全局函数变量
void Init();
BOOL IsInstalled();
BOOL Install();
BOOL Uninstall();
void LogEvent(LPCTSTR pszFormat, ...);
void WINAPI ServiceMain();
void WINAPI ServiceStrl(DWORD dwOpcode);
TCHAR szServiceName[] = _T("ServiceTest");
//
void WINAPI ServiceMain1();
void WINAPI ServiceStrl1(DWORD dwOpcode);
TCHAR szServiceName1[] = _T("ServiceTest1");
//
BOOL bInstall;
bool bStop = false,bStop1 = false;
SERVICE_STATUS_HANDLE hServiceStatus;
SERVICE_STATUS status;
DWORD dwThreadID;int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
Init();

dwThreadID = ::GetCurrentThreadId();

if (stricmp(lpCmdLine, "/install") == 0)
{
Install();
}
else if (stricmp(lpCmdLine, "/uninstall") == 0)
{
Uninstall();
}
else
{
SERVICE_TABLE_ENTRY st[] =
{
{ szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
{ szServiceName1, (LPSERVICE_MAIN_FUNCTION)ServiceMain1 },
{ NULL, NULL }
};
if (!::StartServiceCtrlDispatcher(st))
{
MessageBox(NULL, _T("StartSev"), szServiceName, MB_OK);
LogEvent(_T("Register Service Main Function Error!"));
}
}

return 0;
}
//*********************************************************
//Functiopn: Init
//Description: 初始化
//Calls: main
//Called By:
//Table Accessed:
//Table Updated:
//Input:
//Output:
//Return:
//Others:
//History:
// <author>niying <time>2006-8-10 <version> <desc>
//*********************************************************
void Init()
{
    hServiceStatus = NULL;
    status.dwServiceType = SERVICE_WIN32_SHARE_PROCESS;//SERVICE_WIN32_OWN_PROCESS
    status.dwCurrentState = SERVICE_STOPPED;
    status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
    status.dwWin32ExitCode = 0;
    status.dwServiceSpecificExitCode = 0;
    status.dwCheckPoint = 0;
    status.dwWaitHint = 0;
}

//*********************************************************
//Functiopn: ServiceMain
//Description: 服务主函数,这在里进行控制对服务控制的注册
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input:
//Output:
//Return:
//Others:
//History:
// <author>niying <time>2006-8-10 <version> <desc>
//*********************************************************
void WINAPI ServiceMain()
{
    // Register the control request handler
    status.dwCurrentState = SERVICE_START_PENDING;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP;

//注册服务控制
    hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl);
    if (hServiceStatus == NULL)
    {
        LogEvent(_T("Handler not installed"));
        return;
    }
    SetServiceStatus(hServiceStatus, &status);

    status.dwWin32ExitCode = S_OK;
    status.dwCheckPoint = 0;
    status.dwWaitHint = 0;
status.dwCurrentState = SERVICE_RUNNING;//
SetServiceStatus(hServiceStatus, &status);

//模拟服务的运行,10后自动退出。应用时将主要任务放于此即可
FILE *stream;
    char list[30] = {0};
    int   numread, numwritten;
while (!bStop)//
{

 // Open file in text mode:
if( (stream = fopen( "C:\\fread.txt", "a" )) != NULL )
{
strcpy(list,"test");
numwritten = fwrite(list, sizeof(char), 20, stream);
fclose( stream );
 }
// MessageBox(NULL, _T("StartSev"), szServiceName, MB_OK);
Sleep(1000);
}


    status.dwCurrentState = SERVICE_STOPPED;//
    SetServiceStatus(hServiceStatus, &status);
    LogEvent(_T("Service stopped"));
}
//
void WINAPI ServiceMain1()
{
    // Register the control request handler
    status.dwCurrentState = SERVICE_START_PENDING;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_PAUSE_CONTINUE;//

//注册服务控制
    hServiceStatus = RegisterServiceCtrlHandler(szServiceName1, ServiceStrl1);
    if (hServiceStatus == NULL)
    {
        LogEvent(_T("Handler not installed"));
        return;
    }
    SetServiceStatus(hServiceStatus, &status);

    status.dwWin32ExitCode = S_OK;
    status.dwCheckPoint = 0;
    status.dwWaitHint = 0;
status.dwCurrentState = SERVICE_RUNNING;//
SetServiceStatus(hServiceStatus, &status);

//模拟服务的运行,应用时将主要任务放于此即可
FILE *stream;
char list[30] = {0};
    int   numread, numwritten;
while (!bStop1)//
{
if( (stream = fopen( "C:\\fread2.txt", "a" )) != NULL )
{
strcpy(list,"test");
numwritten = fwrite(list, sizeof(char), 20, stream);
fclose( stream );
 }
// MessageBox(NULL, _T("Service1"), szServiceName1, MB_OK);
Sleep(1000);
}
//

    status.dwCurrentState = SERVICE_STOPPED;//
    SetServiceStatus(hServiceStatus, &status);
    LogEvent(_T("Service stopped"));
}

//*********************************************************
//Functiopn: ServiceStrl
//Description: 服务控制主函数,这里实现对服务的控制,
// 当在服务管理器上停止或其它操作时,将会运行此处代码
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input: dwOpcode:控制服务的状态
//Output:
//Return:
//Others:
//History:
// <author>niying <time>2006-8-10 <version> <desc>

---华软网友回复---
//*********************************************************
void WINAPI ServiceStrl(DWORD dwOpcode)
{
    switch (dwOpcode)
    {
    case SERVICE_CONTROL_STOP:
bStop = true;
status.dwCurrentState = SERVICE_STOP_PENDING;
        SetServiceStatus(hServiceStatus, &status);
//  status.dwCurrentState = SERVICE_STOPPED;
//      SetServiceStatus(hServiceStatus, &status);
        PostThreadMessage(dwThreadID, WM_CLOSE, 0, 0);
        break;
    case SERVICE_CONTROL_PAUSE:
        break;
    case SERVICE_CONTROL_CONTINUE:
        break;
    case SERVICE_CONTROL_INTERROGATE:
        break;
    case SERVICE_CONTROL_SHUTDOWN:
        break;
    default:
        LogEvent(_T("Bad service request"));
    }
}
//
void WINAPI ServiceStrl1(DWORD dwOpcode)
{
    switch (dwOpcode)
    {
    case SERVICE_CONTROL_STOP:
bStop = true;
status.dwCurrentState = SERVICE_STOP_PENDING;//
        SetServiceStatus(hServiceStatus, &status);
        PostThreadMessage(dwThreadID, WM_CLOSE, 0, 0);
        break;
    case SERVICE_CONTROL_PAUSE:
status.dwCurrentState = SERVICE_PAUSE_PENDING;//
        SetServiceStatus(hServiceStatus, &status);
status.dwCurrentState = SERVICE_PAUSED;//
        SetServiceStatus(hServiceStatus, &status);
        //PostThreadMessage(dwThreadID, WM_CLOSE, 0, 0);
        break;
    case SERVICE_CONTROL_CONTINUE:
        break;
    case SERVICE_CONTROL_INTERROGATE:
        break;
    case SERVICE_CONTROL_SHUTDOWN:
        break;
    default:
        LogEvent(_T("Bad service request"));
    }
}
//*********************************************************
//Functiopn: IsInstalled
//Description: 判断服务是否已经被安装
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input:
//Output:
//Return:
//Others:
//History:
// <author>niying <time>2006-8-10 <version> <desc>
//*********************************************************
BOOL IsInstalled()
{
    BOOL bResult = FALSE;

//打开服务控制管理器
    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

    if (hSCM != NULL)
    {
//打开服务
        SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_QUERY_CONFIG);
        if (hService != NULL)
        {
            bResult = TRUE;
            ::CloseServiceHandle(hService);
        }
        ::CloseServiceHandle(hSCM);
    }
    return bResult;
}

//*********************************************************
//Functiopn: Install
//Description: 安装服务函数
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input:
//Output:
//Return:
//Others:
//History:
// <author>niying <time>2006-8-10 <version> <desc>
//*********************************************************
BOOL Install()
{
    if (IsInstalled())
        return TRUE;

//打开服务控制管理器
    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (hSCM == NULL)
    {
        MessageBox(NULL, _T("Couldn't open service manager"), szServiceName, MB_OK);
        return FALSE;
    }

    // Get the executable file path
    TCHAR szFilePath[MAX_PATH];
    ::GetModuleFileName(NULL, szFilePath, MAX_PATH);

//创建服务
    SC_HANDLE hService = ::CreateService(
        hSCM, szServiceName, szServiceName,
        SERVICE_ALL_ACCESS, SERVICE_WIN32_SHARE_PROCESS,//SERVICE_WIN32_OWN_PROCESS
        SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,//SERVICE_AUTO_START
        szFilePath, NULL, NULL, _T(""), NULL, NULL);
SC_HANDLE hService1 = ::CreateService(
        hSCM, szServiceName1, szServiceName1,
        SERVICE_ALL_ACCESS, SERVICE_WIN32_SHARE_PROCESS,//SERVICE_WIN32_OWN_PROCESS
        SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,//SERVICE_AUTO_START
        szFilePath, NULL, NULL, _T(""), NULL, NULL);

    if (hService == NULL)
    {
        ::CloseServiceHandle(hSCM);
        MessageBox(NULL, _T("Couldn't create service"), szServiceName, MB_OK);
        return FALSE;
    }
//运行立即启动
if (!StartService(hService,0,NULL))
    {
//    MessageBox(NULL, _T("Couldn't start service"), szServiceName, MB_OK);
//    return FALSE;
    }
if (!StartService(hService1,0,NULL))
    {
//    MessageBox(NULL, _T("Couldn't start service"), szServiceName, MB_OK);
//    return FALSE;
    }

    ::CloseServiceHandle(hService);
::CloseServiceHandle(hService1);
    ::CloseServiceHandle(hSCM);
    return TRUE;
}

//*********************************************************
//Functiopn: Uninstall
//Description: 删除服务函数
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input:
//Output:
//Return:
//Others:
//History:
// <author>niying <time>2006-8-10 <version> <desc>
//*********************************************************
BOOL Uninstall()
{
    if (!IsInstalled())
        return TRUE;

    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

    if (hSCM == NULL)
    {
        MessageBox(NULL, _T("Couldn't open service manager"), szServiceName, MB_OK);
        return FALSE;
    }

    SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE);
SC_HANDLE hService1 = ::OpenService(hSCM, szServiceName1, SERVICE_STOP | DELETE);//

    if (hService == NULL)
    {
        ::CloseServiceHandle(hSCM);
        MessageBox(NULL, _T("Couldn't open service"), szServiceName, MB_OK);
        return FALSE;
    }
    SERVICE_STATUS status;
    ::ControlService(hService, SERVICE_CONTROL_STOP, &status);
::ControlService(hService1, SERVICE_CONTROL_STOP, &status);//

//删除服务
    BOOL bDelete = ::DeleteService(hService);
    ::CloseServiceHandle(hService);
  BOOL bDelete1 = ::DeleteService(hService1);
     ::CloseServiceHandle(hService1);
    ::CloseServiceHandle(hSCM);

    if (bDelete)
        return TRUE;

    LogEvent(_T("Service could not be deleted"));
    return FALSE;
}

//*********************************************************
//Functiopn: LogEvent
//Description: 记录服务事件
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input:
//Output:
//Return:
//Others:
//History:
// <author>niying <time>2006-8-10 <version> <desc>
//*********************************************************
void LogEvent(LPCTSTR pFormat, ...)
{
    TCHAR    chMsg[256];
    HANDLE  hEventSource;
    LPTSTR  lpszStrings[1];
    va_list pArg;

    va_start(pArg, pFormat);
    _vstprintf(chMsg, pFormat, pArg);
    va_end(pArg);

    lpszStrings[0] = chMsg;

hEventSource = RegisterEventSource(NULL, szServiceName);
if (hEventSource != NULL)
{
ReportEvent(hEventSource, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (LPCTSTR*) &lpszStrings[0], NULL);
DeregisterEventSource(hEventSource);
}
}

就是在那2个服务的while循环中加入MESSAGEBOX,还有,就是假如我把服务禁止了,导致start失败它却又能显示出MessageBox(NULL, _T("StartSev"), szServiceName, MB_OK);
我不懂啊…………
---华软网友回复---
我就是要你不要在服务程序中放MessageBox这样等待用户输入的东西,因为服务进程不在WinSta0窗口站中,显示器上是看不到MessageBox的      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。