我想用RegCreateKeyEX操作注册表,但是代码没提示问题,反倒是运行时提示“对 PInvoke 函数“WindowsApplication2!WindowsApplication1.Form1::RegCreateKeyEX”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。”
代码非常简单,没有过多的东西,但还是调试不过,请高手帮忙看一下原因。
Public Class Form1
Private Structure security_attributes
Dim nlength As Long
Dim lpsecuritydescriptor As Long
Dim binherithandle As Boolean
End Structure
Public Const REG_OPTION_BACKUP_RESTORE = 4
Public Const STANDARD_RIGHTS_ALL = &H1F0000
Public Const KEY_QUERY_VALUE = &H1
Public Const KEY_SET_VALUE = &H2
Public Const KEY_CREATE_SUB_KEY = &H4
Public Const KEY_ENUMERATE_SUB_KEYS = &H8
Public Const KEY_NOTIFY = &H10
Public Const KEY_CREATE_LINK = &H20
Public Const SYNCHRONIZE = &H100000
Public Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))
Public Enum rootkeyenum
hkey_classes_root = &H80000000
hkey_current_user = &H80000001
hkey_local_machine = &H80000002
hkey_users = &H80000003
hkey_performance_data_win2k_only = &H80000004 '//仅win2k
hkey_current_config = &H80000005
hkey_dyn_data = &H80000006
End Enum
Private Declare Function RegCreateKeyEX Lib "advapi32.dll" Alias "RegCreateKeyExA" _
(ByVal hkey As Long, ByVal lpsubkey As String, ByVal reserved As Long, _
ByVal lpclass As String, ByVal dwoptions As Long, _
ByVal samdesired As Long, lpsecurityattributes As security_attributes, _
phkresult As Long, lpdwdisposition As Long) As Long
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim retval As Long
Dim Handle As Long
Dim Result As Long
Result = RegCreateKeyEX(rootkeyenum.hkey_current_user, "\Software\WinRAR\General", 0, vbNullString, REG_OPTION_BACKUP_RESTORE, KEY_ALL_ACCESS, Nothing, Handle, retval)
End Sub
End Class
错误提示如下图:
已经在网上搜索了半天了,网上说的把long型改成integer型也试过,也不好使,难道是我改的方式不对?请高手指点原因,并寻求解决办法。环境VB.NET 2010+.Net 4.0+Win7x86