Vb6 我的声明出了什么问题?

Vb6 我的声明出了什么问题?,vb6,winapi,declare,Vb6,Winapi,Declare,我最近修复了VB6应用程序中的一个错误,但我不确定到底出了什么问题 有问题的部分是CreateEvent的错误API声明。这是API Viewer生成的: Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA" (lpEventAttributes As SECURITY_ATTRIBUTES, ...) As Long 下一个是错误的声明,显然有人不想导入安全属性结构 Declare Function CreateE

我最近修复了VB6应用程序中的一个错误,但我不确定到底出了什么问题

有问题的部分是
CreateEvent
的错误API声明。这是API Viewer生成的:

Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA" 
(lpEventAttributes As SECURITY_ATTRIBUTES, ...) As Long
下一个是错误的声明,显然有人不想导入
安全属性
结构

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
。。。它成功了

现在我有点困惑:

  • 为什么在使用
    SECURITY\u属性时参数
    ByRef
    ,而在使用
    Any
    时参数必须是
    ByVal
  • 为什么错误的声明总是在IDE中工作

如果使用非限定参数作为任何参数,则必须在调用中明确显示。这应该已经解决了问题:

Event = CreateEvent(ByVal 0&, 0, 0, "MyEventName")
我不明白为什么在这里使用
Nothing
,因为这是一个对象引用,调用需要一个指针。
ByVal 0&
所做的是传递一个空指针——因为它是空的,所以它(不是)指向什么并不重要。但是通过
Nothing ByVal
可能会强制
ByVal 0&
,这就是它工作的原因


至于它在IDE中工作的原因,IDE确实倾向于更宽容地对待这样的事情。

ByVal。。。正如任何一个
都是参数声明中最奇怪的情况。