Что пошло не так с моим заявлением об объявлении? - PullRequest
1 голос
/ 04 февраля 2010

Я недавно исправил ошибку в приложении 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?

1 Ответ

3 голосов
/ 04 февраля 2010

Если вы используете неквалифицированный параметр As Any, вы должны быть явно указаны в Call. Это должно было решить проблему:

Событие = CreateEvent (ByVal 0 &, 0, 0, "MyEventName")

Я не понимаю, почему вы бы здесь ничего не использовали, поскольку это ссылка на объект, и вызов ожидает указатель. ByVal 0 & делает передачу нулевого указателя - поскольку он нулевой, не имеет значения, на что он (не) указывает. Но передача Nothing ByVal, вероятно, вызывает ByVal 0 &, поэтому он сработал.

Что касается того, почему он работал в IDE, то IDE, как правило, более прощающе относится к таким вещам.

...