关于在windows服务程序中调用与用户桌面相关的shell函数的有关问题

关于在windows服务程序中调用与用户桌面相关的shell函数的问题
首先,windows服务相关的资料非常少,网上流传的都是msdn上一些极为简单的服务编程的代码。

然后,由于现在都使用windows 7了,通过一些网上的资料,知道win7中服务使用的桌面session0,而用户使用的桌面是session1,session2,...虽然我对这个设定理解不是很深,但也大概知道在服务中很多与用户桌面相关的操作会有限制。之前看了一个把服务的权限令牌复制给用户权限令牌,然后用这个权限令牌可以成功的从服务中打开一个UI窗口,并显示在用户桌面上。

现在我遇到的问题的是,很多操作需要用到shell函数,但服务中使用这些函数时就会出错,如SHGetFolderLocation(0,CSIDL_DESKTOP,0,0,&pidl);用getlasterror获得的错误码为2,即无法找到文件。我试过了很多办法,网上最多的可能是SetProcessWindowStation,SetThreadDesktop,SwitchDesktop,但是我试过了,全部都行不通。错误码依然是2.

我想这类问题可能有2种方法解决。
1,有某种方法,把服务的桌面切换到用户的界面,所有的shell函数问题均能引刃而解。不是到有没有这种方法呢?
2,用其他方法代替shell方法,如SHGetFolderLocation是否可以用其他方法获取到pidl的值呢。

希望服务方面比较懂的大神们给点指导,总的项目是一个服务程序,现在编出来的功能经常有这种问题,不得不又另找方法,太悲剧了。

------解决方案--------------------
SHGetKnownFolderIDList
------解决方案--------------------
可以启动另一个程序,CreateProcessAsUser等来让这个进程跑到user session,然后执行相关动作
------解决方案--------------------
SHELL跟SESSION完全不相干,不是同一个层面的东西,对楼主的问题没有帮助。

先理解一下SHELL的概念:
1.操作系统本来可以不需要SHELL,比如服务器在正常运行的时候不存在SHELL,只有需要进入桌面环境的帐户才会启动SHELL(桌面本身就是SHELL提供的),桌面应用软件可以无障碍地执行任何SHELL函数。
2.SHELL是绑定账号的,也就是说SHELL必须以某个桌面帐户身份运行。

服务不同,服务没有桌面(或者说服务的桌面是CONSOLE),电脑登录进入桌面之前没有SHELL在执行,但是服务已经运行了,服务中不能使用任何SHELL函数。其次,服务是以system帐户身份运行的,system是内置帐户,不是桌面帐户,不能启用桌面。
即使服务被设置成能跟桌面交互,那也只是系统开的一个后门,不代表能显示窗口就能使用SHELL函数。
某些服务可以以桌面帐户身份执行,但同样不能使用SHELL,所以不要以为桌面帐户运行的程序就一定能用SHELL函数。

说得有点绕,总结一下:只有桌面帐户在桌面环境下的应用才能使用SHELL函数;所有服务程序(包括桌面帐户身份运行的服务程序)都不能使用SHELL函数。所以:找其它API替代吧。
------解决方案--------------------
引用:
可以启动另一个程序,CreateProcessAsUser等来让这个进程跑到user session,然后执行相关动作


这个也是一种解决方法呀,服务实在不行,先用这种方法顶上喽~服务你再慢慢研究呗~