Что пошло не так с моим заявлением объявлений?
Вопрос
Недавно я исправил ошибку в приложении VB6, но я не уверен, что именно пошло не так.
Оскорбительная часть была неверной заявлением API CreateEvent
. Отказ Это, какой API зритель генерировал:
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?
Решение
Если вы используете неквалифицированный как любой параметр, вы должны быть явными в вызове. Это должно исправить проблему:
Event = CreateeeVent (BYVAL 0 &, 0, 0, «MYEVENTNAME»)
Я не вижу, почему вы не использовали здесь ничего, так как это ссылка на объект, и вызов ожидает указателя. Что ByVal 0 и делает пропустить нулевой указатель - поскольку он нуль не имеет значения, что он (не) указывает на. Но, проходя ничем уход, вероятно, заставляет Быввал 0 и, именно поэтому он работал.
Что касается того, почему он работал в IDE, ну, IDE делает, как правило, более прощает подобных вещах.