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

来源:互联网 发布:网络电视怎么用机顶盒 编辑:程序博客网 时间:2024/05/22 12:58

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

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

 

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

1)  托盘图标驻留

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

3)  托盘图标右键菜单

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

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

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

 

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

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

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

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

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

 

/* ====================================================================
 * ApacheMonitor.c Simple program to manage and monitor Apache services.
 *
……
BOOL GetApacheServicesStatus()
{
    CHARszKey[MAX_PATH];
    CHARachKey[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);
……
 
intWINAPIWinMain(HINSTANCEhInstance, HINSTANCEhPrevInstance,
                   LPSTRlpCmdLine, intnCmdShow)
{
    CHARszTmp[MAX_LOADSTRING];
    CHARszCmp[MAX_COMPUTERNAME_LENGTH+4];
    MSG msg;
    /* single instance mutex */
    HANDLEhMutex;
    ……
 
    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))
……
原创粉丝点击