程序能把自己加入服务吗
参考Windows API 编程,把程序1加入服务是通过程序2来执行的。用什么方法可以把自身加入服务?
当然能啦,将“将某程序注册为NT服务”的功能块放在其程序中和放在另一个程序中有什么区别?
事实上,绝大部分人也是将之做在同一个程序中的,一般通过运行参数来执行不能的功能
比如 参数带-install就是注册,带-uninstall就是反注册,不带参数就是系统在启动这个服务
int main(int argc,char *argv[]) { if(argc<2) main_2(); else main_1(); system("pause"); return 0; } void main_1( ) { // 设置SERVICE_TABLE_ENTRY 数据结构,以NULL 结构结束, // 作为StartServiceCtrlDispatcher 函数的参数。 SERVICE_TABLE_ENTRY DispatchTable[] = { { "Sample_Srv", (LPSERVICE_MAIN_FUNCTION) SplSrvServiceStart }, { NULL, NULL } }; if (!StartServiceCtrlDispatcher( DispatchTable)) { SvcDebugOut(" [SPLSRV_SERVICE] StartServiceCtrlDispatcher (%d)\n", GetLastError()); } } void main_2( ) { TCHAR szBinFilePath[MAX_PATH]; PTCHAR pTemp; DWORD dwStopError; // 构造服务可执行程序的路径 GetModuleFileName(NULL,szBinFilePath,MAX_PATH); pTemp = szBinFilePath+lstrlen(szBinFilePath); // 打开 SCM schSCManager = OpenSCManager( NULL, // local machine NULL, // ServicesActive database SC_MANAGER_ALL_ACCESS); // full access rights if (NULL == schSCManager) printf("OpenSCManager failed (%d)\n", GetLastError()); // 创建服务 CreateSampleService(schSCManager, szBinFilePath, szServiceName); // 启动服务 StartSampleService(schSCManager,szServiceName); // 发送请求控制 ControlSampleService(SERVICE_CONTROL_INTERROGATE); ControlSampleService(SERVICE_CONTROL_CONTINUE); // 停止服务 dwStopError = StopService( schSCManager, szServiceName, TRUE, 1000); if(ERROR_SUCCESS == dwStopError) { printf("Service Stoped\n"); } else { printf("Service stoped error (%u)\n",dwStopError); } // 删除服务 DeleteSampleService(szServiceName); CloseServiceHandle(schSCManager); }