MSGWAITFORMULTILLOBJECTSEX在VB6中返回87



我当前正在为真实旧应用程序编写服务。我的工作是基于Sergey Merzlikin" NT服务样本"(http://www.smsoft.ru/en/ntservice.htm)。

直到今天,我都使用了ntsvc.ocx,但似乎它在Windows Server Core上不起作用,因为它涉及ActiveX中的表单(我想)。

所以我跳到了全Winapi服务,主要是我有一个问题:

msgwaitformultipleobjectsx,它返回87(无效参数)这个API似乎非常棘手。

原始代码使用msgwaitformultipleObjects,但在msvbvm60.dll中导致应用程序崩溃(C0000005)。测试平台:Windows 2012

我对声明进行了很多调整,所以也许我做了一些问题。无论如何,这是代码中最相关的部分:

Private Declare Function MsgWaitForMultipleObjectsEx Lib "user32" _
   (ByVal nCount As Long, pHandles As Long, _
    ByVal dwMilliseconds, _
    ByVal dwWakeMask As Long, _
    ByVal dwFlags As Long) As Long
Public Declare Function CreateEvent2 Lib "kernel32" Alias "CreateEventW" 
   (ByVal lpEventAttributes As Long, _ 
   ByVal bManualReset As Long, _
   ByVal bInitialState As Long, _
   ByVal lpName As String) As Long
hStopEvent = CreateEvent2(0&, 1&, 0&, vbNullString)
hStopPendingEvent = CreateEvent2(0&, 1&, 0&, vbNullString)
hStartEvent = CreateEvent2(0&, 1&, 0&, vbNullString)
ServiceNamePtr = StrPtr(Service_Name)

我检查了手柄值,它们似乎还可以,但我怀疑他们没有"同步"的安全性描述符http://msdn.microsoft.com/en-us/library/windows/desktop/aa379607(v=vs.85).aspx

然后在示例NT服务中有一个称为MSGWAITOBJ的包装器。这是我用:

替换MSGWAITFORMULTIPLYOBJJECTS的地方
MsgWaitForMultipleObjectsEx(nObj, hObj, T1, QS_ALLEVENTS, 0&)

包装器函数声明为:

Public Function MsgWaitObj(ByVal Interval As Long, _
        Optional ByRef hObj As Long, _
        Optional ByVal nObj As Long = 0&) As Long

MAIN中MSGWaitObj的外部声明和通过的参考文献如下:

hnd = NTService.StartAsService
h(0) = hnd
h(1) = hStartEvent
j(0) = hStopPendingEvent
<...>
IsNTService = MsgWaitObj(INFINITE, h(0), 2&)
<...>
Do
tm = MsgWaitObj(5000&, j(0), 1&)
Loop While tm = WAIT_TIMEOUT

我希望发布代码的摘录是足够的,如果不是,我认为最简单的方法是下载ntservice示例并确定出了什么问题以及我是否处于正确的道路上。

感谢您的帮助。

i从"使用VB6/VB5"文章编写NT服务中测试了Sergey Merzlikin的样本应用程序,并观察到完全不同的行为。详细信息如下,但我猜测服务器核心安装不支持VB6应用程序。

Windows 2012,带有Full Gui

示例Windows Service SvSample.exe在Windows 2012的全新安装中效果很好,没有配置更改。

Windows 2012具有最小服务器接口

然后,我通过此PowerShell命令从成熟的GUI到最小接口:Uninstall-WindowsFeature -Name Server-Gui-Shell –Restart。之后,示例服务仍然没有明显的问题。

Windows 2012 Server Core

然后,我用Uninstall-WindowsFeature -Name Server-Gui-Mgmt-Infra –Restart剥离剩余的位。配置完成并重新启动服务器后,我仔细检查ServerCore-WOW64是否仍在安装(没有它,没有32位应用程序,我可以理解)。

此时,样本服务确实停止工作。尽管没有在msvbvm60.dll中崩溃,但服务控制管理器直言不讳地报告(如系统事件日志中所示):

等待暂停(30000毫秒) 示例VB6服务连接。

由于以下错误,示例VB6服务服务无法启动:
该服务没有及时响应起点或控制请求。

实际上,msvbvm60.dll甚至在C:WindowsSysWOW64中都不存在。

结论

服务器核心(与Windows 2012相反)根本不支持VB6运行时。我没有检查,但是我很确定Windows 2008 R2服务器核心也是如此。

最新更新