请问,通过CreateService函数创建的服务,在window的服务列表中已经可见,但是通过服务时启动总是报1053错误,服务不能启动,显示服务不能响应请求,代码如下:SC_HANDLE sc1, sc2; sc1 = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if(sc1==NULL)
{
//MessageBox("系统服务数据采集失败", "Error", MB_OK|MB_ICONWARNING);
OutputDebugString("系统服务数据采集失败");
return FALSE;
}
else
{
OutputDebugString("系统服务数据采集成功");
}

LPCTSTR lpszDisplayName = "PMC Service"; LPCTSTR lpszBinaryPathName = sFilePath; sc2 = CreateService( 
sc1,              // SCManager database 
"PMC Service for SGM",              // name of service 
lpszDisplayName,           // service name to display 
SERVICE_ALL_ACCESS,        // desired access 
SERVICE_WIN32_OWN_PROCESS, // service type 
SERVICE_AUTO_START,      // start type 
SERVICE_ERROR_NORMAL,      // error control type 
lpszBinaryPathName,        // service's binary 
NULL,                      // no load ordering group 
NULL,                      // no tag identifier 
NULL,                      // no dependencies 
NULL,                      // LocalSystem account 
NULL);                     // no password  if (sc2 == NULL) 
{
OutputDebugString("失败"); 
}
else
{
OutputDebugString("SUCCESS"); 
} CloseServiceHandle(sc2); return TRUE;
}是不是还有其他设置函数调用的问题,谢谢大家,在线等候

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/3796/3796103.xml?temp=.5779077参考我得恢复
      

  2.   

    ERROR_SERVICE_REQUEST_TIMEOUT 服务器没有及时的响应启动或控制请求看看你的EXE是不是写的不对是不是这样写的?不是的话改一下void main(int argc, char* argv[])
    {
    SERVICE_TABLE_ENTRY ServiceTable[] = 
    {
    {SERVERNAME,(LPSERVICE_MAIN_FUNCTION)ServiceMain},
    {NULL,NULL}
    };if(!StartServiceCtrlDispatcher(ServiceTable))
    {
    printf("RegisterServer First");
    }
    }
    ...
      

  3.   

    应该是服务程序的问题,参考VOID WINAPI BeepServiceMain(DWORD dwArgc,LPTSTR *lpszArgv)
    {
          //进入服务的入口函数之后,必须马上调用RegisterServiceCtrlHandler()函数以得
          //到svcStatusHandle,并向SCM报告当前服务的状态为SERVICE_START_PENDING,当服
          //务初始化完成准备正常工作时,再向SCM报告SERVICE_RUNNING。
        
          //设置服务的控制请求回调函数
          svcStatusHandle = RegisterServiceCtrlHandler("BeepService",HandlerEx);
          SendStatusToSCM(SERVICE_START_PENDING,NO_ERROR,0,0,1000);      DWORD dwThreadId;      //ServiceMain返回的时候就是服务结束的时候,所以对于在内存常驻的服务(不常驻,
          //设计成服务也就没有意义了),不能立即返回,一个比较常用的方法是建立事件,然
          //后调用WaitForSingleObject等待事件的触发。在收到SERVICE_CONTROL_STOP请求之
          //后,调用SetEvent触发事件,ServiceMain返回,服务结束。
          
          //通过这个事件来控制是否关闭服务
          hEvent = CreateEvent(NULL,true,false,"{29174EF4-2E42-4EF6-95F9-A7D4101B8284}");      //建立实际的工作线程
          hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)BeepThreadFunc,NULL,0,&dwThreadId);      //通知SCM初始化完成
          SendStatusToSCM(SERVICE_RUNNING,NO_ERROR,0,0,0);      //当收到SERVICE_CONTROL_STOP控制请求时,触发这个事件,服务结束
          WaitForSingleObject(hEvent,INFINITE);
    }
      

  4.   

    系统服务和一般的应用程序流程是不太一样的,你可以看看msdn下“platform sdk\windows base services\exectuables\services”那里有编写系统服务的详细说明。
      

  5.   

    我觉得还是看看MSDN吧,自己印象深刻.