• 20252阅读
  • 10回复

用QT创建WINDOWS服务程序 [复制链接]

上一主题 下一主题
离线liaofg
 

只看楼主 倒序阅读 楼主  发表于: 2009-07-25
— 本帖被 XChinux 执行加亮操作(2009-07-25) —
我想用QT创建一个类似于WINDOWS 服务管理器中的服务,QT程序能做到吗?我查了一下网上,没有看到有这方面的介绐,QT4。5的帮助文档中也没有找到相关的说明,请高手指点
先行谢过了!
离线XChinux

只看该作者 1楼 发表于: 2009-07-25
这个与Qt没啥关系。

我写一段,你将东西套进去就可以了,这里原来写的是定时服务,用的是boost::asio库,当然最好看一看boost::asio相关介绍。

#include <iostream>
#include <fstream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#ifdef _WIN32
#include <windows.h>
#endif

class printer
{
public:
    printer(boost::asio::io_service &io)
    {
    ........
    }

    ~printer()
    {
    }
   ......
};



#ifdef _WIN32
boost::function0<void> console_ctrl_function;
SERVICE_STATUS_HANDLE g_ssh = NULL;
DWORD g_dwStatus = SERVICE_STOPPED;
int g_exitcode;

BOOL WINAPI console_ctrl_handler(DWORD ctrl_type)
{
    switch (ctrl_type)
    {
        case CTRL_C_EVENT:
        case CTRL_BREAK_EVENT:
        case CTRL_CLOSE_EVENT:
        case CTRL_SHUTDOWN_EVENT:
            console_ctrl_function();
            return TRUE;
        default:
            return FALSE;
    }
}

void SetStatus(DWORD dwStatus)
{
    SERVICE_STATUS ss = {
        SERVICE_WIN32_OWN_PROCESS,
        SERVICE_STOPPED,
        SERVICE_ACCEPT_STOP,
        NO_ERROR,
        0,
        1,
        5000};

    ss.dwCurrentState = dwStatus;
    SetServiceStatus(g_ssh, &ss);
    g_dwStatus = dwStatus;
}


VOID WINAPI Handler(DWORD dwCtl)
{
    switch (dwCtl)
    {
        case SERVICE_CONTROL_STOP:
            console_ctrl_function();
            break;
        default:
            SetStatus(g_dwStatus);
    }
}

VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
{
    g_ssh = RegisterServiceCtrlHandler(lpszArgv[0], Handler);

    SetStatus(SERVICE_START_PENDING);
    try
    {
        boost::asio::io_service io;
        printer p(io);
        console_ctrl_function = boost::bind(&boost::asio::io_service::stop, &io);
        SetStatus(SERVICE_RUNNING);
        io.run();
        g_exitcode = EXIT_SUCCESS;
    }
    catch (std::exception &e)
    {
        std::cerr << "[EXCEPTION]\t" << e.what() << std::endl;
        g_exitcode = EXIT_FAILURE;
    }
    catch (const char *e)
    {
        std::cerr << "[EXCEPTION]\t" << e << std::endl;
        g_exitcode = EXIT_FAILURE;
    }
    SetStatus(SERVICE_STOPPED);
}

int main(int argc, char **argv)
{
    SERVICE_TABLE_ENTRY arSvc[] =
    {
        {L"ChinuxTeam TestServ v1.0", ServiceMain},
        {NULL, NULL}
    };
    if (!StartServiceCtrlDispatcher(arSvc))
    {
        std::cerr << "Start Service Error" << std::endl;
        return EXIT_FAILURE;
    }
    return g_exitcode;
}

#endif
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线XChinux

只看该作者 2楼 发表于: 2009-07-25
boost::asio的示例中有写Win32服务及POSIX服务的示例程序,上面的代码就是从里面摘出来的。
注册服务命令:


sc create TestServ binPath="your/exec/path" start= auto

删除服务

sc delete TestServ


启动服务
net start TestServ

停止服务
net stop TestServ
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线liaofg

只看该作者 3楼 发表于: 2009-07-26
非常感谢版主
离线yj_yulin

只看该作者 4楼 发表于: 2009-07-26
qt solution有关于service的,跟qt整合得好一点,不过如果只是想实现服务,不是要搞什么跨平台啊,库啊之类的,在win上直接参考msdn吧,搜索也可以给出一大堆的代码
离线dbzhang800

只看该作者 5楼 发表于: 2009-07-27
离线ifelse

只看该作者 6楼 发表于: 2009-07-28
感谢斑竹!
离线apeart

只看该作者 7楼 发表于: 2015-10-11
离线z55716368

只看该作者 8楼 发表于: 2015-10-11
学习了 大神些都
每一个问题 都是一次进步
离线q小玩家

只看该作者 9楼 发表于: 2018-03-10
学习了,boost真的是第二个std
离线dosmlp

只看该作者 10楼 发表于: 2018-03-13
关键系统api
OpenSCManager
CreateService
另外要写一个windows服务程序,还要按一定规定来写,不然可能会出问题
参考http://blog.csdn.net/rongxiaojun1989/article/details/30028239
快速回复
限100 字节
 
上一个 下一个