我在这个网页 http://www.vckbase.com/document/viewdoc/?id=1677
看到一个系统服务的例子因为我的程序要使用驱动,我想把使用驱动这部份,做为服务,然后我的程式只需要访问这个服务就行了请问我需要怎么修改,希望能提供思路或关键代码,我现在是用程序加载驱动的//这个循环体怎么写,象下面这样注释掉,服务启动就报错void WINAPI ServiceMain()
{
    // Register the control request handler
    status.dwCurrentState = SERVICE_START_PENDING;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP; LogEvent(_T("Register Service Success!")); //注册服务控制
    hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl);
    if (hServiceStatus == NULL)
    {
        LogEvent(_T("Handler not installed"));
        return;
    }
    SetServiceStatus(hServiceStatus, &status);    status.dwWin32ExitCode = S_OK;
    status.dwCheckPoint = 0;
    status.dwWaitHint = 0;
status.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(hServiceStatus, &status); //模拟服务的运行,10后自动退出。应用时将主要任务放于此即可
//int i = 0;
//while (runing)
//{
// ControlService(hService,SERVICE_CONTROL_INTERROGATE,&status)
// if(status.dwCurrentState != SERVICE_RUNNING)
// runing=false;
//}
// //   status.dwCurrentState = SERVICE_STOPPED;
 //   SetServiceStatus(hServiceStatus, &status);
 //   LogEvent(_T("Service stopped"));
}
还有请问,我的驱动的加载,是不是在 这个函数的开头,我后驱动的卸载放在 服务停止的函数里面?

解决方案 »

  1.   

    推荐你使用这个WIN32服务c++类
    初始化驱动的加载可以在OnInit()和Run()都可以,卸载的时候在Run()要退出的时候,不过记得好像关机的时候服务是不知道的,是系统强制结束服务进程。
      

  2.   


    谢谢,我试了下,那三个PROJECT不能用转换啊,我用的是vs2008郁闷还有,请问,我的应用程序怎么和服务沟通数据服务去访问驱动,我访问服务得到我要的数据
      

  3.   

    管道,共享内存,对于一些简单的请求,用系统函数 ControlService 很容易实现
    VS2008上可以用哪个类的,我做过的,把文件添加到工程,派生个服务子类,处理下OnInit和Run就好了。
    驱动加载在什么地方都可以的吧,只要加载一次以后都可以使用了,应该没有地方限制,在main处理也应该没有问题。
      

  4.   

    http://www.vckbase.com/document/viewdoc/?id=1447
      

  5.   

    今天人比较少啊,服务搞定了,开始搞程式和服务沟通了用的方法是 我在这个网页 http://www.vckbase.com/document/viewdoc/?id=1677我的思路应该是正确的,servermain 注册了服务控制后,就开始加载我的驱动,然后
    在停止的时候,卸载我的驱动,服务里面debug能读出数据出来
      

  6.   

    驱动可以直接作为服务进行加载,可以通过如DeviceIoControl函数传递IOCTL来控制。
    如果还要使用服务来包装的话,可以使用如内存映射、管道、socket等方式,需要注意安全描述符的指定。
    还是直接加载驱动较为方便。
      

  7.   

    谢谢你的建议我这样做是因为
    在win7系统里面就会郁闷了,那个加载驱动,必须得以管理员方式运行,你的程序才能加载驱动,如果你的程序还要开机自动启动,你就会更郁闷了,没办法嘛,只有用服务加载驱动,因为他是 system power 然后应用程序就普通权限也可以工作了
      

  8.   

    没看明白你究竟要实现什么。随便提几点参考建议:
    1、驱动程序可以自动加载。
    2、一般用户身份的进程可以通过调用服务组件来实现高权限的操作。
    3、服务程序可以在当前session中创建进程与用户交互,新进程可以继承服务权限。
      

  9.   

    报错是因为你将while()....注释掉了....这个得留着...
      

  10.   


    要实现什么,在9楼,因为驱动不是设备驱动,不需要安装的,没有inf,必须得由一个程序去LOAD先前做法是用我的应用程式去加载,但在win7 系统下面 uac 开着的话,老是说弹出请求管理员权限,开机自启动也会(这个不是直接放在 启动选项里面的,直接放的话,提示框都没有的),所以就换方法,用服务解决驱动部分
      

  11.   

    不是很明白你想实现什么功能。lz是想通过服务在win加载系统前加载从而来避开uac把。我看过一个师兄写过。先写好一个服务。然后创建一个命名管道。然后管道获得所有要执行的文件的名字和路径。然后提升权限。
      

  12.   


    加载驱动,要管理员权限,就是不想让程序运行的时候,弹出这个请求管理员权限的窗口,各位在vista以后的系统上面  uac 开着的,你就会发现这问题,就是程序图标上面有个盾牌的....
      

  13.   

    http://www.wangchao.net.cn/bbsdetail_35162.html
    这个文章写服务如何创建以及原理比较好。希望对你有帮组
      

  14.   


    谢谢,和我在vckbase 看到一样的思路