Я недавно исправил ошибку в приложении 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
, но должен быть ByVal
при использовании Any
? - Почему неправильное объявление всегда работает в IDE?