源码版的MySQL使用了许多Windows API,这些API还是值得学习的。在/mysql-5.0.0-alpha-win-src/mysql-5.0.0-alpha/sql/nt_servc.cpp的NTService::IsService(LPCSTR ServiceName)就使用了两个API:OpenSCManager和OpenService。
看了一下MSDN,原来这两个API可以通过制定的服务名来启动网络上某台机器上的服务。大致过程分为三步:
1. 连接SCM(Service Connect Manager)数据库。
2. 获得某个Service的句柄。
3. 通过获得的句柄来启动Service。
下面是根据MSDN的源码启动MySQL服务的代码。前提是我的机器已经安装了MySQL, 那么MySQL已经是注册的服务了。
#include <windows.h>
#include <stdio.h>
TCHAR szSvcName[80];
SC_HANDLE schSCManager;
SC_HANDLE schService;
VOID DoStartSvc()
{
SERVICE_STATUS_PROCESS ssStatus;
DWORD dwOldCheckPoint;
DWORD dwStartTickCount;
DWORD dwWaitTime;
DWORD dwBytesNeeded;
//第一步: 获得数据库连接
schSCManager = OpenSCManager(
NULL, //local computer
NULL, //ServicesActive database
SC_MANAGER_ALL_ACCESS); //full access rights
if(NULL == schSCManager)
{
printf("OpenSCManager failed (%d)/n",GetLastError());
return;
}
//第二步:获得Service句柄
schService = OpenService(
schSCManager, //SCM database
szSvcName, //name of service
SERVICE_ALL_ACCESS);//full access
if(schService==NULL)
{
printf("OpenService failed (%d)/n",GetLastError());
CloseServiceHandle(schSCManager);
return;
}
//第三步:启动Service
if(!StartService(
schService, //handle to service
0, //number of arguments
NULL)) //no arguments
{
printf("StartService failed (%d)/n",GetLastError());
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return;
}
else
{
printf("OK");
}
}
void main()
{
//不知道该怎么给TCHAR数组赋值,就这么写了。
szSvcName[0]=TCHAR('M');
szSvcName[1]=TCHAR('y');
szSvcName[2]=TCHAR('S');
szSvcName[3]=TCHAR('Q');
szSvcName[4]=TCHAR('L');
szSvcName[5]=TCHAR(0);
DoStartSvc();
}
测试代码时,建议把任务管理器上的“服务”那一栏勾出来。