我有以下代码在所有操作系统(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位机器时,一切正常!
答案 0 :(得分:0)
此错误在Microsoft SBS Server 2011上也很明显。
您遇到的问题似乎是基于提升,您没有在具有正确高程的用户范围内运行该应用程序。
您是否尝试过向应用程序添加清单以确保其正确升级,此外,为了进行测试,您可能希望编译应用程序(调用方)并使用管理员的凭据运行。
值得注意的是,Microsoft Windows 2008和2011具有范围限制,因为您无法与流程或服务进行交互,而不是以您自己的级别或更高级别进行交互。这种安全功能引起了许多麻烦。
因此,如果您有提升,请尝试不要。
答案 1 :(得分:0)
对CreateService的调用会生成对RCreateServiceW或RCreateServiceWOW64的RPC调用。 RPC调用返回0x000006d1,它代表RPC_S_PROCNUM_OUT_OF_RANGE,这意味着底层RPC层失败(请求的opnum不存在)。这可能是一个错误......