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

时间:2010-02-04 10:46:13

标签: vb6 winapi declare

我最近在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
  • 为什么错误的声明始终在IDE中起作用?

1 个答案:

答案 0 :(得分:3)

如果使用非限定的As Any参数,则必须在Call中显式。这应该解决了这个问题:

Event = CreateEvent(ByVal 0&,0,0,“MyEventName”)

我不明白为什么你在这里使用Nothing,因为那是一个Object引用,并且调用期望一个指针。什么ByVal 0&是传递一个空指针 - 因为它是null,它指向什么(没有)并不重要。但是传递Nothing ByVal可能会迫使ByVal 0&这就是它工作的原因。

至于它在IDE中的工作原理,IDE确实对这类事情更加宽容。