用QT建立WINDOWS服務程式

來源:互聯網
上載者:User

標籤:bsp   com   har   bre   als   default   get   sts   ctr   

我寫一段,你將東西套進去就可以了,這裡原來寫的是定時服務,用的是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

 

qt solution有關於service的,跟qt整合得好一點,不過如果只是想實現服務,不是要搞什麼跨平台啊,庫啊之類的,在win上直接參考msdn吧,搜尋也可以給出一大堆的代碼

 

https://code.msdn.microsoft.com/CppWindowsService-cacf4948

    不要謝 千萬不要謝

 

用QT建立WINDOWS服務程式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.