我有一个打开服务数据库的.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"
关于如何解决这个问题的任何想法?
答案 0 :(得分:-1)
好的,我明白了。 将Int32更改为UInt64就可以了。在此更改后,程序编译为" anycpu"在.Net V4及以上版本适用于所有Windows版本,我测试了32位和64位版本。
案件结案。