我的下列程序在启动服务时,提示错误,不能启动!不知道错在哪儿,谢谢!!
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
如解决,两贴的分数全部奉上!
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
如解决,两贴的分数全部奉上!
WinExec(Pchar(getcurrentdir+'\Tap.exe'),SW_SHOW);是没有错误的
怎样才算是正宗?
怎样使用API?我再加100!大家赶快来替我解决一下,好吗?再解决不了,我要自杀了!!呜呜~~~~~
#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);
}
//---------------------------------------------------------------------------
//发送服务状态到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;
}
//---------------------------------------------------------------------------