0

我有一个打开服务数据库的 .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"

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

4

1 回答 1

0

好,我知道了。将 Int32 更改为 UInt64 可以解决问题。在 .Net V4 及更高版本下编译为“anycpu”的更改程序适用于所有 Windows 版本,并且我测试了 32 位和 64 位版本。

结案。

于 2016-12-21T09:25:33.733 回答