1

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

有问题的部分是错误的 API 声明CreateEvent。这就是 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必须是?ByValAny
  • 为什么错误的声明总是在 IDE 中起作用?
4

1 回答 1

3

如果使用不合格的 As Any 参数,则必须在调用中显式。这应该解决了问题:

Event = CreateEvent(ByVal 0&, 0, 0, "MyEventName")

我不明白你为什么要Nothing在这里使用,因为这是一个对象引用并且调用需要一个指针。什么ByVal 0&是传递一个空指针——因为它是空的,它(不)指向什么并不重要。但是传递Nothing ByVal可能是力量ByVal 0&,这就是它起作用的原因。

至于为什么它在 IDE 中工作,嗯,IDE 确实倾向于对这样的事情更加宽容。

于 2010-02-04T13:17:22.070 回答