Winapi 初始化服务后获取服务状态句柄

Winapi 初始化服务后获取服务状态句柄,winapi,service,interop,.net-1.1,Winapi,Service,Interop,.net 1.1,我正在从.Net 1.1调用Win32 API以请求服务的额外启动时间(.Net 2.0及更高版本当前不是选项)。下面是我在OnStart()方法中调用的伪代码 这部分很好用。我收到每个的有效(非IntPtr.Zero)句柄,我可以很好地更新服务状态。但是,我确实需要将此代码放在Init()方法中(我正在改装一个超时的遗留服务)。但是,当我将此代码移动到Init()方法时,我可以获得服务控制管理器和服务本身的有效句柄,但不能获得服务状态。我生成的非工作代码如下所示 private void My

我正在从.Net 1.1调用Win32 API以请求服务的额外启动时间(.Net 2.0及更高版本当前不是选项)。下面是我在OnStart()方法中调用的伪代码

这部分很好用。我收到每个的有效(非IntPtr.Zero)句柄,我可以很好地更新服务状态。但是,我确实需要将此代码放在Init()方法中(我正在改装一个超时的遗留服务)。但是,当我将此代码移动到Init()方法时,我可以获得服务控制管理器和服务本身的有效句柄,但不能获得服务状态。我生成的非工作代码如下所示

private void MyServiceClass(){
    InitializeComponent();

    private IntPtr statusHandle;
    private IntPtr serviceHandle;
    private IntPtr serviceControlManagerHandle;

    serviceControlManagerHandle = ServiceUtil.OpenSCManager(null, null, (uint)ServiceUtil.SCM_ACCESS.SC_MANAGER_ALL_ACCESS);
    serviceHandle = ServiceUtil.OpenService(serviceControlManagerHandle, this.ServiceName, (uint)ServiceUtil.SERVICE_ACCESS.SERVICE_ALL_ACCESS);
    statusHandle = ServiceUtil.RegisterServiceCtrlHandler(this.ServiceName, serviceHandle);

    //This fills the empty object with VALID data
    SERVICE_STATUS status = ServiceUtil.QueryServiceStatus(serviceHandle, ref status)

    //This returns an INVALID pointer.
    statusHandle = ServiceUtil.RegisterServiceCtrlHandler(this.ServiceName, serviceHandle);
}
在这两种情况下,QueryServiceStatus使用有效值填充“状态”。但是,只有第一个示例将“statusHandle”设置为有效指针。在进入OnStart()方法之前,如何获取服务状态结构的有效句柄?

如果函数(很可能是由
ServiceUtil.RegisterServiceCtrlHandler
方法调用的函数)失败,它将返回空指针

尝试调用函数以获取出错的详细信息。我猜这是个时间问题。服务本身在初始化期间可能无法接受处理程序函数


你到底想达到什么目的?我们也许能想出一个不同的解决办法

恩里科,我想你是对的。GetLastError返回未处理的异常0xC0000005,访问冲突读取位置0xCDCDCD。我目前正在使用重构服务初始化过程,看看是否可以构建自己的服务初始化过程。我会让你知道我的结果。
private void MyServiceClass(){
    InitializeComponent();

    private IntPtr statusHandle;
    private IntPtr serviceHandle;
    private IntPtr serviceControlManagerHandle;

    serviceControlManagerHandle = ServiceUtil.OpenSCManager(null, null, (uint)ServiceUtil.SCM_ACCESS.SC_MANAGER_ALL_ACCESS);
    serviceHandle = ServiceUtil.OpenService(serviceControlManagerHandle, this.ServiceName, (uint)ServiceUtil.SERVICE_ACCESS.SERVICE_ALL_ACCESS);
    statusHandle = ServiceUtil.RegisterServiceCtrlHandler(this.ServiceName, serviceHandle);

    //This fills the empty object with VALID data
    SERVICE_STATUS status = ServiceUtil.QueryServiceStatus(serviceHandle, ref status)

    //This returns an INVALID pointer.
    statusHandle = ServiceUtil.RegisterServiceCtrlHandler(this.ServiceName, serviceHandle);
}