【发布时间】:2010-02-04 10:46:13
【问题描述】:
我最近修复了一个 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
...它成功了。
现在我有点疑惑:
- 为什么使用
SECURITY_ATTRIBUTES时参数ByRef而使用Any时必须是ByVal? - 为什么错误的声明总是在 IDE 中起作用?
【问题讨论】:
-
ByVal ... As Any是最离奇的参数声明案例。