Что пошло не так с моим заявлением объявлений?

StackOverflow https://stackoverflow.com/questions/2198993

  •  25-09-2019
  •  | 
  •  

Вопрос

Недавно я исправил ошибку в приложении 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 делает, как правило, более прощает подобных вещах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top