首页
社区
课程
招聘
安装一个服务, 返回值说是“参数不正确”....
发表于: 2011-3-5 14:05 4316

安装一个服务, 返回值说是“参数不正确”....

2011-3-5 14:05
4316
function MySteupService : Boolean;
var
        ServiceBinaryPathName : String;
  SCManager, SCService : SC_Handle;
  ss : TServiceStatus;
  //dwNumServiceArgs : DWORD;
  lpServiceArgVectors: PChar;

  lpBytesReturned : DWORD;

begin
  Result:=False;

  ss.dwCurrentState := 0;
        SCManager := OpenSCManager(nil,   // 电脑名。如果为NULL,则为本机
                       nil,   // SCM数据库标识,应该为SERVICES_ACTIVE_DATABASE或者如果为NULL,则SEVICES_ACTIVE_DATABASE数据库作为默认数据库被打开。
                       SC_MANAGER_ALL_ACCESS);  // 以何种权限打开
  // 本函数返回一个SC_HANDLE的句柄以便作为其他函数的参数来操作SCM数据库。
  SCService:=OpenService(SCManager, 'nxemc', SERVICE_ALL_ACCESS);

    if SCService = 0 then   // Service 不存在
    begin
          SCService := CreateService(SCManager,                          // 是OpenSCManager得到的返回值,即服务管理器的句柄。
                                                                   'MyService',               // Service的名字,这个Service的相应信息存放在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Service\lpServiceName子键下;
                                                                   'MyService',               //Service在服务控制面板中显示的名字
                                                             SERVICE_ALL_ACCESS,           // 访问Service的权限类型
                                                             SERVICE_WIN32,        // Service的类型,可以是SERVICE_FILE_SYSTEM_DRIVER、SERVICE_KERNEL_DRIVER、SERVICE_WIN32_OWN_PROCESSS、SERVICE_WIN32_SHARE_PROCESS之一;
                                                             SERVICE_BOOT_START,         // Service启动类型,可以是自动(SERVICE_ATUO_START)、手动(SERVICE_DEMAND_START)、禁止(SERVICE_DISABLED);
                                                             SERVICE_ERROR_IGNORE,         // 出错控制,SERVICE_ERROR_IGNORE和SERVICE_ERROR_NORMAL表示出错时在日志中纪录并继续。两个参数的区别是SERVICE_ERROR_NORMAL将会在出错时向用户显示一条出错信息,SERVICE_ERROR_SERVER和SERVICE_ERROR_CRITICAL告诉系统在失败时重启;
                                                             Pchar(StrSystemDir +  'MyService.exe'), // 驱动的路径,也是服务的路径;
                                                             nil,                          // 如果这个服务是加载服务组中的一个,这个指针指向这者字符串数组,一般为NULL;
                                                             nil,                          // 指针,指向的变量,接收的值用於区别lpLoadOrderGroup服务组中的不同服务,一般为NULL;
                                                             nil,                          // 这个Service所依赖的其他服务,在启动本Service之前需要先启动这些服务;
                                                             nil,                          // 帐号
                                                             nil);
                                             // 密码
                         ServiceBinaryPathName:=SysErrorMessage(GetLastError);// 到这里出错了, 说参数不正确
    end
    else
    begin
    ControlService(SCService, SERVICE_CONTROL_STOP, ss);
    end;
  //GetLastError

       ServiceBinaryPathName:=SysErrorMessage(GetLastError);

  QueryServiceStatus(SCService,  SS);
  if SS.dwCurrentState <> SERVICE_RUNNING then
  begin
  lpServiceArgVectors:=nil;
    Result:=StartService(SCService,                   // Service的句柄;
                         0,                     // 指定在lpServiceArgVectors指向的数组中参数的个数,如果lpServiceArgVectors为NULL,这个值为0;
                         Pchar(lpServiceArgVectors));  // 指向传递给Service的参数字符串数组的指针,可以为NULL;
   // Str:=SysErrorMessage(GetLastError);
  end
  else Result:=True;

  //if not Result then Showmessage(Inttostr(GetLastError));
        if SCService > 0 then
    CloseServiceHandle(SCService);

  if SCManager > 0 then
    CloseServiceHandle(SCManager);

end;

不知什么参数导致不正确, 我这个只是一个简单的服务,只要求开机运行,不是驱动服务。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
悬赏金诱人,可惜我是菜鸟。
2011-3-5 16:50
0
雪    币: 84
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
SERVICE_BOOT_START  0x00000000
A device driver started by the system loader. This value is valid only for driver services.

可以看到,只有驱动程序可以SERVICE_BOOT_START,普通服务是不行的。SERVICE_WIN32类型的服务,要想开机运行,用SERVICE_AUTO_START,你的注释都写了......
2011-3-5 19:07
0
游客
登录 | 注册 方可回帖
返回
//