我最近在VB6应用程序中修复了一个错误,但我不确定,到底出了什么问题。
违规部分是CreateEvent
的错误API声明。这就是API Viewer生成的内容:
Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA"
(lpEventAttributes As SECURITY_ATTRIBUTES, ...) As Long
下一个是错误声明,显然有人不想导入SECURITY_ATTRIBUTES
结构......
Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA"
(lpEventAttributes As Any, ...) As Long
电话是:
Event = CreateEvent(Nothing, 0, 0, "MyEventName")
此调用在IDE中始终 ,但从从编译的.exe中完成。 (CreateEvent
总是返回0)
我将声明更改为:
Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA"
(ByVal lpEventAttributes As Any, ...) As Long
......它有效。
现在我有点困惑:
ByRef
时,为什么参数SECURITY_ATTRIBUTES
,但使用ByVal
时必须为Any
?答案 0 :(得分:3)
如果使用非限定的As Any参数,则必须在Call中显式。这应该解决了这个问题:
Event = CreateEvent(ByVal 0&,0,0,“MyEventName”)
我不明白为什么你在这里使用Nothing,因为那是一个Object引用,并且调用期望一个指针。什么ByVal 0&是传递一个空指针 - 因为它是null,它指向什么(没有)并不重要。但是传递Nothing ByVal可能会迫使ByVal 0&这就是它工作的原因。
至于它在IDE中的工作原理,IDE确实对这类事情更加宽容。