从.NET V4调用时,OpenSCManager返回无效句柄

时间:2016-12-18 11:15:46

标签: vb.net advapi32

我有一个打开服务数据库的.NET VB winforms程序,在从.NET v2转换为v4之后,它停止了工作。 从VB .NET v4及更高版本调用时,来自advapi32.dll的函数openscmanager返回无效句柄。

所有工作正常编译为.NET v2到v3.5,但在同一台机器上为.NET V4及更高版本编译时失败

在安装了.NET 4.5.1和4.6.1的Windows Server 2012 R2上使用Visual Studio V2013或V2015 有趣的是,相同的代码在Windows 7 64位下工作正常,并且安装了相同的框架版本

剥离代码:

    Imports System.Runtime.InteropServices

    Public Class Form1
        Const SC_MANAGER_CREATE_SERVICE As Int32 = &H2
        Dim scHandle As Int32 = 0

        Declare Function OpenSCManager Lib "advapi32.dll" Alias "OpenSCManagerA" _
                                      (ByVal lpMachineName As String, _
                                       ByVal lpDatabaseName As String, _
                                       ByVal dwDesiredAccess As Integer) As Int32

        Declare Function CloseServiceHandle Lib "advapi32.dll" Alias "CloseServiceHandle" _
                                      (ByVal hSCObject As IntPtr) As Boolean

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

            scHandle = OpenSCManager(".", Nothing, SC_MANAGER_CREATE_SERVICE)
            scHandle = CloseServiceHandle(scHandle)

            MsgBox(New System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()).ToString)
        End Sub
    End Class

在.NET v2下编译返回:

"System.ComponentModel.Win32Exception: The operation completed successfully"

在.NET v4下编译返回:

"System.ComponentModel.Win32Exception (0x80004005): The handle is invalid"

关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:-1)

好的,我明白了。 将Int32更改为UInt64就可以了。在此更改后,程序编译为" anycpu"在.Net V4及以上版本适用于所有Windows版本,我测试了32位和64位版本。

案件结案。