Delphi 2009在CreateServiceW上崩溃(仅在Windows 2008 R2中)

时间:2011-04-15 10:35:32

标签: delphi delphi-2009 windows-server-2008-r2

我有以下代码在所有操作系统(32和64位)上运行良好,除了Windows 2008 R2(SP0& SP1)

fSvcMgr := OpenSCManagerW(PwideChar(FOptions.ComputerName), nil,
      SC_MANAGER_ALL_ACCESS);
    if fSvcMgr = 0 then
    begin
      iserror := true;
      RaiseLastWin32Error;
    end;
...
fSvc := OpenServiceW(fSvcMgr, pwidechar(Service_name),SERVICE_ALL_ACCESS);
if fSvc = 0 then
begin
  fSvc := CreateServiceW(fSvcMgr,
          pwidechar(Service_name),
          pwidechar(Service_name),
          SERVICE_ALL_ACCESS, 
          SERVICE_WIN32_OWN_PROCESS,
          SERVICE_DEMAND_START,
          SERVICE_ERROR_IGNORE,
          pwidechar(fServiceName), nil, nil, nil, nil, nil);
  if fSvc = 0 then
  begin
     iserror := true;
     RaiseLastWin32Error;
  end;
end;

连接到远程32位机器时会发生这种情况:

当调试delphi在CreateserviceW行崩溃时,消息'应用程序定义的异常(代码0x000006d1)在......进程停止。 尝试/除了createserviceW周围没有任何区别。

连接到远程64位机器时,一切正常!

2 个答案:

答案 0 :(得分:0)

此错误在Microsoft SBS Server 2011上也很明显。

您遇到的问题似乎是基于提升,您没有在具有正确高程的用户范围内运行该应用程序。

您是否尝试过向应用程序添加清单以确保其正确升级,此外,为了进行测试,您可能希望编译应用程序(调用方)并使用管理员的凭据运行。

值得注意的是,Microsoft Windows 2008和2011具有范围限制,因为您无法与流程或服务进行交互,而不是以您自己的级别或更高级别进行交互。这种安全功能引起了许多麻烦。

因此,如果您提升,请尝试不要。

答案 1 :(得分:0)

对CreateService的调用会生成对RCreateServiceWRCreateServiceWOW64的RPC调用。 RPC调用返回0x000006d1,它代表RPC_S_PROCNUM_OUT_OF_RANGE,这意味着底层RPC层失败(请求的opnum不存在)。这可能是一个错误......