求助注册表API函数RegCreateKeyEX的奇怪问题

VBcom 2020-04-08 04:48:25
我想用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
...全文
385 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
VBcom 2020-04-17
  • 打赏
  • 举报
回复
再补充一句,我用这个API函数是为了绕过注册表权限的,有个表项所有者是TrustedInstaller,用.net自带类操作不了
VBcom 2020-04-17
  • 打赏
  • 举报
回复
好了,我来总结一下问题,然后结贴。 第一,我主贴里写的代码有两类问题,第一类,部分变量应该用Integer,不应该用Long。第二类,声明API时,后三个变量应该加Byref,忘加了,所以报错。 综上,6楼点明了问题关键,3楼提供网页里的声明方式,经测试也能运行,所以结贴你们两个一人一半分吧
面向医学编程 2020-04-15
  • 打赏
  • 举报
回复
引用 5 楼 VBcom的回复:
[quote=引用 4 楼 学医之人的程序之旅 的回复:] 你的winapi声明类型有错,不该用long,用integer,反正vb6的long相当于.net的integer。这是很常见的问题,百度你都能随便找到解决方案
是的,你看我的主贴,我最后写的很清楚,我百度查了,这个问题可能是变量long和integer的问题,但是我也尝试修改了,把所有long变integer,但还是不行,同样错误,如果你能在你的电脑上也跑一下就知道还是不行了。[/quote] 那你是否知道.net下传参不指定默认byval,vb6默认byref,你细品两者的差别,这就是为什么你的错了。你里面没有byref这个传参,你认为和vb6一样省略了默认byref。如果不是这个错,我注销账号不玩了
VBcom 2020-04-15
  • 打赏
  • 举报
回复
引用 4 楼 学医之人的程序之旅 的回复:
你的winapi声明类型有错,不该用long,用integer,反正vb6的long相当于.net的integer。这是很常见的问题,百度你都能随便找到解决方案
是的,你看我的主贴,我最后写的很清楚,我百度查了,这个问题可能是变量long和integer的问题,但是我也尝试修改了,把所有long变integer,但还是不行,同样错误,如果你能在你的电脑上也跑一下就知道还是不行了。
面向医学编程 2020-04-09
  • 打赏
  • 举报
回复
你的winapi声明类型有错,不该用long,用integer,反正vb6的long相当于.net的integer。这是很常见的问题,百度你都能随便找到解决方案
zj_zwl 2020-04-09
  • 打赏
  • 举报
回复
http://www.pinvoke.net/default.aspx/advapi32/RegCreateKeyEx.html 你这个明显写错了
VBcom 2020-04-08
  • 打赏
  • 举报
回复
是的,.net可以直接操作注册表,但我用这个有其他用途,.net类实现不了的,所以还是烦请大家从技术方面提出建议,方案好坏就不讨论了
zj_zwl 2020-04-08
  • 打赏
  • 举报
回复
.net里已经提供了操作注册表的类,没必要这么做了

16,721

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧