利用apache源码自制服务管理程序

xiaoxiao2021-03-01  81

利用apache源码自制服务管理程序

当我们开发一个后台应用时,通常没有界面,并且会把它注册成一个服务程序。但是,如果普通用户要对这个服务进行重启,关闭等操作,他必须要到控制面板-管理工具-服务那里才能进行。更重要的是,机器启动后,用户并不能明显地看到服务是否在运行等信息,所以,最好为该应用添加一个常驻托盘并能动态显示运行状况的功能(比如瑞星等杀毒程序就有这个功能)。那么,是不是我们需要为应用特意实现这个功能呢?答案是不用,因为我们有apache

作为一个开源的web服务器,apche除了给我们提供web服务之外,还有一些小工具一起发布在源码包里,其中一个名字叫ApacheMonitor,请将这个工具的源码考出来,稍作改动就可以自制一个专用的服务管理程序,并且马上具备以下功能:

1) 托盘图标驻留

2) 托盘图标动态显示服务运行情况

3) 托盘图标右键菜单

4) 托盘图标左键菜单,用来管理具体服务

5) 服务管理配置窗口(包含服务启动,停止,日志等)

6) 和应用服务是独立的,两者互不干扰

那么,我们到底需要怎么做呢?很简单,

1) VC6打开ApacheMonitor工程的工作空间

2) 更改一下代码中的几处地方,主要是:我们后台应用的判断条件(比如:可执行文件的路径名中含有的关键字,这个用来判断哪些服务是我们所关心的)以及应用的互斥体名字(用来识别应用是否重复启动),见后面源码中的粗体字部分

3) 如果你对外观不满意,可以在资源文件中更改文字图标等信息,让它完全满足您的要求(开源就是好^_^

4) 编译一下,执行看看效果,这是我制作的一个样例(还没有换掉apache的大羽毛):

<shapetype id="_x0000_t75" path=" m@4@5 l@4@11@9@11@9@5 xe" stroked="f" filled="f" o:spt="75" o:preferrelative="t" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0 "></f><f eqn="sum @0 1 0 "></f><f eqn="sum 0 0 @1 "></f><f eqn="prod @2 1 2 "></f><f eqn="prod @3 21600 pixelWidth "></f><f eqn="prod @3 21600 pixelHeight "></f><f eqn="sum @0 0 1 "></f><f eqn="prod @6 1 2 "></f><f eqn="prod @7 21600 pixelWidth "></f><f eqn="sum @8 21600 0 "></f><f eqn="prod @7 21600 pixelHeight "></f><f eqn="sum @10 21600 0 "></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 398.25pt; HEIGHT: 248.25pt" coordsize="21600,21600" type="#_x0000_t75"><imagedata src="./利用apache源码自制服务管理程序.files/image001.png" o:title=""></imagedata></shape>

/* ==================================================================== * ApacheMonitor.c Simple program to manage and monitor Apache services. * …… BOOL GetApacheServicesStatus() { CHAR szKey [ MAX_PATH ]; CHAR achKey [ MAX_PATH ]; …… dwBufLen = MAX_PATH ; rv = RegQueryValueEx ( hSubKey , "ImagePath" , NULL , & dwKeyType , szImagePath , & dwBufLen ); if ( rv == ERROR_SUCCESS && ( dwKeyType == REG_SZ || dwKeyType == REG_EXPAND_SZ ) && dwBufLen ) { lstrcpy ( szBuf , szImagePath ); CharLower ( szBuf ); /* the service name could be httpd*.exe or Apache*.exe */ /*if (((strstr(szBuf, "//apache") != NULL) || (strstr(szBuf, "//httpd") != NULL)) && strstr(szBuf, ".exe") && (strstr(szBuf, "--ntservice") != NULL || strstr(szBuf, "-k ") != NULL))*/ if ( strstr ( szBuf , "//inms" ) != NULL ) { g_stServices [ stPos ]. szServiceName = strdup ( achKey ); …… int WINAPI WinMain ( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow ) { CHAR szTmp [ MAX_LOADSTRING ]; CHAR szCmp [ MAX_COMPUTERNAME_LENGTH +4]; MSG msg ; /* single instance mutex */ HANDLE hMutex ; …… g_hBmpStop = LoadImage ( hInstance , MAKEINTRESOURCE ( IDB_BMPSTOP ), IMAGE_BITMAP , XBITMAP , YBITMAP , LR_DEFAULTCOLOR ); hMutex = CreateMutex ( NULL , FALSE , "IGOVIEWSRVMON_MUTEX" ); if (( hMutex == NULL ) || ( GetLastError () == ERROR_ALREADY_EXISTS )) ……
转载请注明原文地址: https://www.6miu.com/read-3200156.html

最新回复(0)