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);
}

对,重点就上边这几句话,就完成了(必须非模态,必须有消息循环)

希望对大家有帮助!

你可能感兴趣的:(VC++)