应用程序改为服务后无法从接收外来消息的错误 你知道,服务是系统用户下的程序,属于控制台程序,一般是没有GUI的,这也就意味着它没有消息循环,不能接受消息。解决的办法一如 xstring(麻雀) 所说,但是并不根本。还有一种办法,就是把当前的桌面绑定到这个服务上,用SetThreadDesktop,然后启动一个消息线程,可以重载CCmdTarget来创建,这样就可以接受消息映射了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我的服务开启了一个隐藏窗口用于解手消息并分发到消息处理线程,同时还开启了两个线程,其中一个用来开启一个套接字接收数据包,另一个则处理接收的数据包,服务总共开启一个窗口、三个用户界面线程。 我在服务的ServiceMain中加了如如下语句:void WINAPI ServiceMain(DWORD argc, LPTSTR argv[]){ HDESK hdesk; HWINSTA hwinsta; hwinsta = OpenWindowStation("winsta0", FALSE, WINSTA_ACCESSCLIPBOARD | WINSTA_ACCESSGLOBALATOMS | WINSTA_CREATEDESKTOP | WINSTA_ENUMDESKTOPS | WINSTA_ENUMERATE | WINSTA_EXITWINDOWS | WINSTA_READATTRIBUTES | WINSTA_READSCREEN | WINSTA_WRITEATTRIBUTES); if (hwinsta == NULL) { LogEvent(_T("open window station err"),0,FALSE); } if (!SetProcessWindowStation(hwinsta)) { LogEvent(_T("Set window station err"),0,FALSE); } hdesk = OpenDesktop("default", 0, FALSE, DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL | DESKTOP_JOURNALPLAYBACK | DESKTOP_JOURNALRECORD | DESKTOP_READOBJECTS | DESKTOP_SWITCHDESKTOP | DESKTOP_WRITEOBJECTS); if (hdesk == NULL) { LogEvent(_T("Open desktop err"),0,FALSE); } SetThreadDesktop(hdesk); hSStat = RegisterServiceCtrlHandler( ServiceName, ServerCtrlHandler); if (hSStat == 0) LogEvent (_T("Cannot register control handler"), 100, TRUE); LogEvent (_T("Control handler registered successfully"), 0, FALSE); SetStatus(hSStat, SERVICE_START_PENDING); OpenThread(); while(m_ServicWndPtr->ee) { Sleep(1000); } SetStatus(hSStat, SERVICE_STOPPED); LogEvent (_T("服务状态1转为:SERVICE_STOP"), 0, FALSE);}void OpenThread(){ //与警情服务器通信线程 m_ServicWndPtr=(CServiceWnd *)AfxBeginThread(RUNTIME_CLASS(CServiceWnd)); //处理警情服务器命令包线程 m_threadPtr =(CThread *)AfxBeginThread(RUNTIME_CLASS(CThread)); //处理TSAPI消息线程 m_messthreadptr =(CMessThread *)AfxBeginThread(RUNTIME_CLASS(CMessThread)); .....................} 但还是无法收到消息,但奇怪的是当我卸载这个服务时却收到了以前应该收到的所有消息,这说明消息已经发到了我的消息分发窗口。但为什么在服务运行期间,该窗口却无法收到消息了? TRY CATCH? 免费给大家贡献孙鑫《MFC深入详解》修订版 视频教程及示例代码 局域网聊天系统,模拟QQ做的,顺便散分,顺便收集意见 请教,全屏切换问题 创建的问题 单选按钮问题: 如何使单选按钮的背景设置为透明 帮忙看看,窗口怎么出不来 我想自己写CString.Format 急求:VC++6.0如何用socket传递数据集 ListCtrl 问题,请关注 如何下到<<WINDOWS网络编程技术>>附带光盘的原码 CListBox选中一行以后,将产生什么消息?
void WINAPI ServiceMain(DWORD argc, LPTSTR argv[])
{
HDESK hdesk;
HWINSTA hwinsta;
hwinsta = OpenWindowStation("winsta0", FALSE,
WINSTA_ACCESSCLIPBOARD |
WINSTA_ACCESSGLOBALATOMS |
WINSTA_CREATEDESKTOP |
WINSTA_ENUMDESKTOPS |
WINSTA_ENUMERATE |
WINSTA_EXITWINDOWS |
WINSTA_READATTRIBUTES |
WINSTA_READSCREEN |
WINSTA_WRITEATTRIBUTES);
if (hwinsta == NULL)
{
LogEvent(_T("open window station err"),0,FALSE);
} if (!SetProcessWindowStation(hwinsta))
{
LogEvent(_T("Set window station err"),0,FALSE);
} hdesk = OpenDesktop("default", 0, FALSE,
DESKTOP_CREATEMENU |
DESKTOP_CREATEWINDOW |
DESKTOP_ENUMERATE |
DESKTOP_HOOKCONTROL |
DESKTOP_JOURNALPLAYBACK |
DESKTOP_JOURNALRECORD |
DESKTOP_READOBJECTS |
DESKTOP_SWITCHDESKTOP |
DESKTOP_WRITEOBJECTS);
if (hdesk == NULL)
{
LogEvent(_T("Open desktop err"),0,FALSE);
} SetThreadDesktop(hdesk);
hSStat = RegisterServiceCtrlHandler( ServiceName, ServerCtrlHandler); if (hSStat == 0)
LogEvent (_T("Cannot register control handler"), 100, TRUE); LogEvent (_T("Control handler registered successfully"), 0, FALSE);
SetStatus(hSStat, SERVICE_START_PENDING);
OpenThread();
while(m_ServicWndPtr->ee)
{
Sleep(1000);
}
SetStatus(hSStat, SERVICE_STOPPED);
LogEvent (_T("服务状态1转为:SERVICE_STOP"), 0, FALSE);
}void OpenThread()
{
//与警情服务器通信线程
m_ServicWndPtr=(CServiceWnd *)AfxBeginThread(RUNTIME_CLASS(CServiceWnd));
//处理警情服务器命令包线程
m_threadPtr =(CThread *)AfxBeginThread(RUNTIME_CLASS(CThread)); //处理TSAPI消息线程
m_messthreadptr =(CMessThread *)AfxBeginThread(RUNTIME_CLASS(CMessThread));
.....................
}
但还是无法收到消息,但奇怪的是当我卸载这个服务时却收到了以前应该收到的所有消息,这说明消息已经发到了我的消息分发窗口。但为什么在服务运行期间,该窗口却无法收到消息了?