我的下列程序在启动服务时,提示错误,不能启动!不知道错在哪儿,谢谢!!
unit Start1;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;type
  TTapStart = class(TService)
    procedure ServiceExecute(Sender: TService);
  private
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;var
  TapStart: TTapStart;implementation{$R *.DFM}procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  TapStart.Controller(CtrlCode);
end;function TTapStart.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;procedure TTapStart.ServiceExecute(Sender: TService);
begin
 WinExec(Pchar(getcurrentdir+'\Tap.exe'),SW_SHOW);
 end;end.
http://expert.csdn.net/Expert/topic/1118/1118526.xml?temp=.800213
如解决,两贴的分数全部奉上!

解决方案 »

  1.   

    编写一个NT服务程序吧,这样显得不太正宗。有没有试过WinExec(Pchar(getcurrentdir+'\Tap.exe'),SW_SHOW);是否出错
      

  2.   

    to youmingzhihuo(幽冥之火)
    WinExec(Pchar(getcurrentdir+'\Tap.exe'),SW_SHOW);是没有错误的
    怎样才算是正宗?
      

  3.   

    1、路径对了没有?强烈建议使用GetModuleFileName(NULL,...)得到运行路径。2、服务缺省情况下是不允许有用户界面的,如果想有用户界面,必须指定SERVICE_INTERACTIVE_PROCESS标志,我不知道在TService里边是哪一个属性。3、因为服务没有用户界面,也就是没有建立窗口,所以没有线程消息循环。如果想在服务里边启动程序的话,必须先建立一个线程,再在线程里边调用ShellExecuteEx函数,然后指定标志SEE_MASK_FLAG_DDEWAIT,见MSDN说明:The SEE_MASK_FLAG_DDEWAIT flag must be specified if the thread calling ShellExecuteEx does not have a message loop or if the thread or process will terminate soon after ShellExecuteEx returns. Under such conditions, the calling thread will not be available to complete the DDE conversation, so it is important that ShellExecuteEx complete the conversation before returning control to the caller. Failure to complete the conversation can result in an unsuccessful launch of the document.URL : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/structures/shellexecuteinfo.asp=================嘿嘿,我的确认为使用TService不够正宗,直接使用API才叫正宗!=================你发了一个帖子,叫什么“CSDN有没有高手?”,没有人有责任为你答问题,爱答就答,不爱答就不答,关你什么事?而且那个问题放在非技术区,非技术区的分数是不算到专家分里边的,我Faint!
      

  4.   

    实在对不起 BCB_FANS(四大名捕之追杀令) 老兄,我已经转到技术区了!
      

  5.   

    toBCB_FANS(四大名捕之追杀令) 老兄 嘿嘿,我的确认为使用TService不够正宗,直接使用API才叫正宗!
    怎样使用API?我再加100!大家赶快来替我解决一下,好吗?再解决不了,我要自杀了!!呜呜~~~~~
      

  6.   

    //---------------------------------------------------------------------------#include <vcl.h>
    #pragma hdrstop#include <WinSvc.h>
    #include <Forms.hpp>#include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma argsused//---------------------------------------------------------------------------
    //自定义控制码
    const int SERVICE_CONTROL_OPENWINLOGONDESKTOP = 128;//---------------------------------------------------------------------------
    //状态句柄,通过这个句柄和SCM进行通讯
    SERVICE_STATUS_HANDLE   svcStatusHandle;HANDLE hThread;    //服务线程
    HANDLE hEvent;     //等待服务线程结束//辅助函数
    void  __fastcall DecideRunStyle(int argc, char* argv[],bool &IsInstall,bool &IsUninstall);
    void  __fastcall InstallService();
    void  __fastcall UninstallService();
    bool  __fastcall SendStatusToSCM(DWORD dwCurrentState,DWORD dwWin32ExitCode,
       DWORD dwServiceSpecificExitCode,DWORD dwCheckPoint,DWORD dwWaitHint);
    DWORD __fastcall GetServiceState(SC_HANDLE schService);//服务代码
    VOID WINAPI BeepServiceMain(DWORD dwArgc,LPTSTR *lpszArgv);
    VOID WINAPI HandlerEx(DWORD fdwControl);//实际服务代码
    DWORD WINAPI BeepThreadFunc();
    //---------------------------------------------------------------------------//---------------------------------------------------------------------------
    //在这个线程里边启动程序
    DWORD WINAPI RunAppThreadFunc();//---------------------------------------------------------------------------
    //
    int main(int argc, char* argv[])
    {
      bool IsInstall = false;
      bool IsUninstall = false;  //决定启动类型
      DecideRunStyle(argc,argv,IsInstall,IsUninstall);  //安装服务
      if(IsInstall)
      {
        InstallService();
      }
      //删除服务
      else if(IsUninstall)
      {
        UninstallService();
      }
      //运行服务,通过SCM或者其他控制程序运行,不能使用程序本身
      else
      {
        SERVICE_TABLE_ENTRY Service_Table[] = {{"BeepService",BeepServiceMain},{NULL,NULL}};    if(StartServiceCtrlDispatcher(Service_Table) == 0)
        {
          MessageBox(NULL,AnsiString("Failed Call StartServiceCtrlDispatcher.Err = " +
            SysErrorMessage(GetLastError())).c_str(),NULL,MB_OK | MB_APPLMODAL |
                     MB_ICONWARNING | MB_SERVICE_NOTIFICATION);
        }
      }
      return 0;
    }
    //---------------------------------------------------------------------------
    //带参数-install  运行时安装服务
    //带参数-uninstall运行时卸载服务
    void  __fastcall DecideRunStyle(int argc, char* argv[],bool &IsInstall,bool &IsUninstall)
    {
      AnsiString TempStr;  for(int i=0; i < argc; i++)
      {
        TempStr = AnsiString(argv[i]).LowerCase();
        if(TempStr.Pos("uninstall") > 0)
        {
          IsUninstall = true;
          break;
        }
        else if(TempStr.Pos("install") > 0)
        {
          IsInstall = true;
          break;
        }
      }
    }
    //---------------------------------------------------------------------------
    //有两种方式启动服务:
    //1、使用自动启动,即StartType为SERVICE_AUTO_START,这时候必须重新启动电脑。
    //2、使用手动启动,即StartType为SERVICE_DEMAND_START,这时候可到控制面板里边
    //   使用“服务”控制程序或者其它的控制程序来启动。
    //3、本程序使用第2种方法。
    void  __fastcall InstallService()
    {
      char FilePath[256];
      SC_HANDLE schSCManager;
      SC_HANDLE schService;  if(GetModuleFileName(NULL,FilePath,sizeof(FilePath)) == 0)
      {
        MessageBox(NULL,SysErrorMessage(GetLastError()).c_str(),NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING | MB_SERVICE_NOTIFICATION);
        return;
      }
      else //如果目录中含有空格,必须使用""包括起来
      {
        AnsiString TempStr(FilePath);    ZeroMemory(FilePath,sizeof(FilePath));
        CopyMemory(FilePath,AnsiString("\"" + TempStr + "\"").c_str(),TempStr.Length() + 2);
      }  schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
      if(schSCManager)
      {
        schService = CreateService(schSCManager,
                                   "BeepService",
                                   "Beep Service Test",
                                   SERVICE_ALL_ACCESS,
                                   SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,
                                   SERVICE_DEMAND_START,//安装后可直接到“服务”里边启动
                                   SERVICE_ERROR_NORMAL,
                                   FilePath,
                                   NULL,
                                   NULL,
                                   NULL,
                                   NULL,                //Running on "localsystem" account
                                   NULL);
        if(schService)
        {
          //设置服务的Description
          SERVICE_DESCRIPTION svcDesc;      svcDesc.lpDescription = "Beep every 2 seconds";
          ChangeServiceConfig2(schService,SERVICE_CONFIG_DESCRIPTION,&svcDesc);
        }
        else
        {
          MessageBox(NULL,AnsiString("Failed Create Service.Err = " + SysErrorMessage(GetLastError())).c_str(),NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING | MB_SERVICE_NOTIFICATION);
        }
      }
      else
      {
        MessageBox(NULL,AnsiString("Failed Open SCManager.Err = " + SysErrorMessage(GetLastError())).c_str(),NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING | MB_SERVICE_NOTIFICATION);
      }  CloseServiceHandle(schService);
      CloseServiceHandle(schSCManager);
    }
    //---------------------------------------------------------------------------
    //卸载服务
    void  __fastcall UninstallService()
    {
      SC_HANDLE schSCManager;
      SC_HANDLE schService;  schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
      if(schSCManager)
      {
        schService = OpenService(schSCManager,"BeepService",SERVICE_ALL_ACCESS);
        if(schService)
        {
          //如果服务正在运行,则先关闭服务
          if(GetServiceState(schService) != SERVICE_STOPPED)
          {
            SERVICE_STATUS svcStatus;        if(ControlService(schService,SERVICE_CONTROL_STOP,&svcStatus))
            {
              DWORD dwServiceState;          dwServiceState = svcStatus.dwCurrentState;
              while(dwServiceState != SERVICE_STOPPED)
              {
                Sleep(svcStatus.dwWaitHint);
                dwServiceState = GetServiceState(schService);
              }
            }
            else
            {
              MessageBox(NULL,AnsiString("Failed Call ControlService.Err = " + SysErrorMessage(GetLastError())).c_str(),NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING | MB_SERVICE_NOTIFICATION);
            }
          }      //删除服务
          if(DeleteService(schService) == 0)
          {
            MessageBox(NULL,AnsiString("Failed Delete Service.Err = " + SysErrorMessage(GetLastError())).c_str(),NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING | MB_SERVICE_NOTIFICATION);
          }
        }
        else
        {
          MessageBox(NULL,AnsiString("Failed Open Service.Err = " + SysErrorMessage(GetLastError())).c_str(),NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING | MB_SERVICE_NOTIFICATION);
        }
      }
      else
      {
        MessageBox(NULL,AnsiString("Failed Open SCManager.Err = " + SysErrorMessage(GetLastError())).c_str(),NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING | MB_SERVICE_NOTIFICATION);
      }  CloseServiceHandle(schService);
      CloseServiceHandle(schSCManager);
    }
    //---------------------------------------------------------------------------
      

  7.   


    //发送服务状态到SCM
    bool  __fastcall SendStatusToSCM(DWORD dwCurrentState,DWORD dwWin32ExitCode,
       DWORD dwServiceSpecificExitCode,DWORD dwCheckPoint,DWORD dwWaitHint)
    {
      SERVICE_STATUS svcStatus;
      bool IsSuccess;  //////
      svcStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
      svcStatus.dwCurrentState = dwCurrentState;  //////
      if(dwCurrentState == SERVICE_START_PENDING)
        svcStatus.dwControlsAccepted = 0;
      else
        svcStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP |
            SERVICE_ACCEPT_PAUSE_CONTINUE |
       SERVICE_ACCEPT_SHUTDOWN;
      //////
      if(dwServiceSpecificExitCode == 0)
        svcStatus.dwWin32ExitCode = dwWin32ExitCode;
      else
      {
        svcStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
        svcStatus.dwServiceSpecificExitCode = dwServiceSpecificExitCode;
      }  /////
      svcStatus.dwCheckPoint = dwCheckPoint;
      svcStatus.dwWaitHint = dwWaitHint;  IsSuccess = SetServiceStatus(svcStatusHandle,&svcStatus);  return IsSuccess;
    }
    //---------------------------------------------------------------------------
    //得到服务的当前状态
    DWORD __fastcall GetServiceState(SC_HANDLE schService)
    {
      SERVICE_STATUS svcStatus;  if(QueryServiceStatus(schService,&svcStatus))
      {
        return svcStatus.dwCurrentState;
      }
      else
      {
        MessageBox(NULL,AnsiString("Failed Call QueryServiceStatus.Err = " + SysErrorMessage(GetLastError())).c_str(),NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING | MB_SERVICE_NOTIFICATION);
        return -1;
      }
    }
    //---------------------------------------------------------------------------
    //服务代码
    VOID WINAPI BeepServiceMain(DWORD dwArgc,LPTSTR *lpszArgv)
    {
      svcStatusHandle = RegisterServiceCtrlHandler("BeepService",HandlerEx);
      SendStatusToSCM(SERVICE_START_PENDING,NO_ERROR,0,0,1000);  DWORD dwThreadId;  //通过这个事件来控制是否关闭服务
      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);
    }
    //---------------------------------------------------------------------------
    //处理控制请求函数
    VOID WINAPI HandlerEx(DWORD fdwControl)
    {
      DWORD dwCurrentState;  switch(fdwControl)
      {
        case SERVICE_CONTROL_STOP:      SendStatusToSCM(SERVICE_STOP_PENDING,NO_ERROR,0,0,1000);      CloseHandle(hThread);      //触发事件,结束服务
          SetEvent(hEvent);      dwCurrentState = SERVICE_STOPPED;
          break;    case SERVICE_CONTROL_PAUSE:      SendStatusToSCM(SERVICE_PAUSE_PENDING,NO_ERROR,0,0,5000);      dwCurrentState = SERVICE_PAUSED;      //经过测试,发现只要安装服务时指定了SERVICE_INTERACTIVE_PROCESS标志,不管
          //是否使用OpenWindowStation和OpenDesktop这些函数,对话框都能显示出来。如果
          //不指定这个标志,就算使用OpenWindowStation和OpenDesktop函数,对话框也不能
          //显示。//     {
    //       TForm2 *Form2 = new TForm2((TComponent*)NULL);
    //       Form2->ShowModal();
    //       delete Form2;
    //     }//      if(OpenDefaultDesktop())
    //      {
    //        if(MessageBox(NULL,"Are your sure to pause Service now?",NULL,MB_YESNO | MB_TOPMOST) == IDYES)
    //        {
    //          SuspendThread(hThread);
    //          dwCurrentState = SERVICE_PAUSED;
    //        }
    //        RestoreDesktop();
    //      }
          break;    case SERVICE_CONTROL_CONTINUE:      SendStatusToSCM(SERVICE_CONTINUE_PENDING,NO_ERROR,0,0,100);      ResumeThread(hThread);      dwCurrentState = SERVICE_RUNNING;
          break;    case SERVICE_CONTROL_INTERROGATE:
          break;    case SERVICE_CONTROL_SHUTDOWN:      CloseHandle(hThread);
          SetEvent(hEvent);
          break;    //自定义控制代码,这里仅仅是启动一个程序
        case SERVICE_CONTROL_OPENWINLOGONDESKTOP:      {
            HANDLE hThread;
            DWORD dwThreadId;        hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)RunAppThreadFunc,NULL,0,&dwThreadId);
            CloseHandle(hThread);
          }      break;
      }  SendStatusToSCM(dwCurrentState,NO_ERROR,0,0,1000);
    }
    //---------------------------------------------------------------------------
    //启动别的程序
    DWORD WINAPI RunAppThreadFunc()
    {
      STARTUPINFO si;
      PROCESS_INFORMATION pi;  //一定要注意路径是否正确
      AnsiString RunPath = "F:\\Inprise\\CBuilder5\\Projects\\HookAPI\\Exe\\Project1.exe";  ZeroMemory(&si,sizeof(STARTUPINFO));
      si.cb = sizeof(STARTUPINFO);
      si.dwFlags = STARTF_USESHOWWINDOW;
      si.wShowWindow = SW_SHOW;  return CreateProcess(NULL,RunPath.c_str(),NULL,NULL,false,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
    }
    //---------------------------------------------------------------------------//服务主线程,每2秒钟就让计算机喇叭响一下
    //---------------------------------------------------------------------------
    DWORD WINAPI BeepThreadFunc()
    {
      while(true)
      {
        Beep(200,200);
        Sleep(2000);
      }
      return 1;
    }
    //---------------------------------------------------------------------------
      

  8.   

    1、我的名字叫BCB_FANS,代码当然是C++Builder的,如果你看不懂BCB代码,我也没有办法了。2、使用ShellExecuteEx出问题了,改用CreateProcess(...)成功了,邪门!3、上面的服务的启动类型是SERVICE_DEMAND_START,必须到“服务”里边启动,如果你想让它开机就启动,把SERVICE_DEMAND_START改为SERVICE_AUTO_START就可以了。4、带参数-install运行时是安装服务,带-uninstall是卸载服务。5、上面代码是不是看起来比TService复杂多了?API程序都这样,不过我还是建议你使用API来编服务程序,只有这样才能只其然还知其所以然。