Недавно я исправил ошибку в приложении 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?
ByVal ... As Any— самый странный случай объявления параметра. - person wqw   schedule 06.02.2010