关于Windows服务程序和普通Windows应用程序的区别

a220315410 2011-03-07 02:13:02
想请教一些问题:
Windows服务程序和普通的应用程序有什么区别?
我发现在Windows服务中,我使用MessageBox函数,没效果,界面上没有出现窗口,而貌似使用keydb_eventAPI也没有效果?
有没有熟悉的大哥帮我解释下,谢谢~
...全文
1118 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
a220315410 2011-03-07
  • 打赏
  • 举报
回复
网上找了一些资料,的确是Session0的隔离造成的,网上有解决方案,虽然是C#不过也可以参考,虽然改成C++需要费点力气了。
参考:http://www.cnblogs.com/gnielee/archive/2010/04/08/session0-isolation-part2.html
PS:MVP果然给力~
a220315410 2011-03-07
  • 打赏
  • 举报
回复
按照东哥的方案,还是有点效果的,不过不是很理想,当我在服务中弹出一个messagebox的时候,屏幕上会弹出这样一个窗口:
点击窗口上的查看消息,就会打个一个新的桌面,一个windows经典样子的桌面,很有远程桌面的感觉,这个桌面上貌似无法截图,所以我也没法把那个界面截给大家看了。
它说可能是不兼容造成的,代码如下:
	MessageBox(NULL,"123","123",MB_OK);

这样的代码还不兼容,我也不知道该如何了。。。
Sidyhe 2011-03-07
  • 打赏
  • 举报
回复
我说错了,服务是在Session 0中......Vista以上系统才变动的
Sidyhe 2011-03-07
  • 打赏
  • 举报
回复
摘抄自某程序开源代码,仅供参考:

HWINSTA hWinSta = OpenWindowStation("winsta0", FALSE, MAXIMUM_ALLOWED);
if (hWinSta != NULL)SetProcessWindowStation(hWinSta);

还有一个是设置线程Desktop的自写函数,由于代码N行,就不贴了.
a220315410 2011-03-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mayudong1 的回复:]
SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS

CreateService的dwServiceType参数这样写
[/Quote]
谢谢东哥,不过貌似还是不行。
a220315410 2011-03-07
  • 打赏
  • 举报
回复
但是,服务运行在System用户名下,好像给界面交互带来了很大的麻烦。
wutaihua 2011-03-07
  • 打赏
  • 举报
回复
其实注册一个服务,就是调用本地的一个exe来实现的。或者说服务就是将本地的exe包装了一下。在启动服务的时候,其实际使用的还是exe程序的。所以当你的执行程序是界面的时候,那你的服务不就是带界面的了。服务没想象中的那么神秘,如果是你熟悉了服务的注册流程,就会知道如何包装一个exe为一个服务程序了。
mayudong1 2011-03-07
  • 打赏
  • 举报
回复
SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS

CreateService的dwServiceType参数这样写
a220315410 2011-03-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mayudong1 的回复:]
设置成可与桌面交互可以吗

明明记得以前写的一个服务甚至都带着一个对话框都没问题的
[/Quote]
请教如何设置成能与能与桌面交互?
a220315410 2011-03-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sidyhe 的回复:]
在Windows服务中,使用MessageBox函数,需要和桌面交互
dwServiceType要指定SERVICE_WIN32_OWN_PROCESS参数(貌似只适用于EXE)

服务程序,不管是EXE还是DLL,都要和服务管理器(SCM)交互,否则系统不承认你的服务.

服务程序是在Section0下工作,无法直接操作当前桌面(获取窗体,发送消息等),需要切换.
[/Quote]
关于section0能再给一些信息么?SERVICE_WIN32_OWN_PROCESS我有设置,而且我的服务的确是exe文件。但是我不明白,如何切换。
mayudong1 2011-03-07
  • 打赏
  • 举报
回复
设置成可与桌面交互可以吗

明明记得以前写的一个服务甚至都带着一个对话框都没问题的
Sidyhe 2011-03-07
  • 打赏
  • 举报
回复
在Windows服务中,使用MessageBox函数,需要和桌面交互
dwServiceType要指定SERVICE_WIN32_OWN_PROCESS参数(貌似只适用于EXE)

服务程序,不管是EXE还是DLL,都要和服务管理器(SCM)交互,否则系统不承认你的服务.

服务程序是在Section0下工作,无法直接操作当前桌面(获取窗体,发送消息等),需要切换.
a220315410 2011-03-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qq495472913 的回复:]
系统不同
[/Quote]
你比网上的资料说得更简单。。。
QQ495472913 2011-03-07
  • 打赏
  • 举报
回复
系统不同
a220315410 2011-03-07
  • 打赏
  • 举报
回复
网上的资料说,因为运行在不同的控制台,所以服务是无法和用户界面交互的。不过,这个对我来说太简单,笼统了,能否有人给个更加具体,详细的解释?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧