【问题标题】:What went wrong with my Declare statement?我的 Declare 声明出了什么问题?
【发布时间】: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 是最离奇的参数声明案例。

标签: vb6 winapi declare


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-03
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 2016-02-08
    • 2013-11-16
    • 2020-06-18
    相关资源
    最近更新 更多