天天看點

MFC應用程式 變身成 windows服務程式

最近開發一個運作在winserver2008的服務程式,有簡單配置界面,有socket服務端代碼,有一些windows消息處理(比如WM_WTSSESSION_CHANGE 、WM_TIMER);

很簡單的一個程式,也不需要什麼特别的要求(跨平台什麼的),是以直接用MFC寫了,結果一用出問題了:

該2008伺服器經常用來做RDP-remoteapp模式的伺服器來用(比如IE,原因是因為網絡限制,隻有伺服器能通路特定的IP,比如https://192.168.1.123),

在RDP-RemoteApp(IE)模式下,用administratro帳号登入,結束時會導緻帳号登出,一登出,我的托盤程式就被殺死了。。。

就想如何不讓它被殺死, 就想改成服務吧,一般的服務寫過,主要是socket服務程式,而我這個程式已經寫完了,代碼不算少,全部重寫為服務程式,效率太低了;

而且還必須要處理好幾個windows消息, 倒騰了近1天,終于實作了,很簡單從MFC 應用程式改成windows服務,特此記錄一下!

windows服務相關的代碼就不寫了,網上一搜就很多,也很好,主要說MFC應用程式的改動.

在InitInstance函數中,把建立Dlg的代碼都注釋掉(暫時),換成服務開始函數(主要包括SERVICE_TABLE_ENTRY和StartServiceCtrlDispatcher),

在entrytable[0].lpServiceProc所指向的服務主函數中,最後結束的位置協商建立Dlg的代碼(改成非模态,然後加上消息循環),如下:

CMyDlg dlg;
dlg.Create(IDD_MYDIALOG_DIALOG,NULL);
dlg.ShowWindow(SW_SHOW);

MSG msg;
whie(GetMessage(&msg, dlg.GetSafeHwnd(), 0,0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
           

對,重點就上邊這幾句話,就完成了(必須非模态,必須有消息循環)

希望對大家有幫助!

繼續閱讀