J'ai récemment corrigé un bug dans une application VB6, mais je ne suis pas sûr, ce qui s'est mal passé.Qu'est-ce qui n'a pas fonctionné avec ma déclaration Declare?
La partie incriminée était une déclaration d'API incorrecte de CreateEvent
. Ceci est, ce que l'API Viewer généré:
Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA"
(lpEventAttributes As SECURITY_ATTRIBUTES, ...) As Long
Le prochain est la mauvaisedéclare, évidemment quelqu'un ne voulait pas importer la structure SECURITY_ATTRIBUTES
...
Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA"
(lpEventAttributes As Any, ...) As Long
L'appel a été:
Event = CreateEvent(Nothing, 0, 0, "MyEventName")
Cet appel a travaillé toujours dans l'IDE, mais jamais à partir du fichier .exe compilé. (CreateEvent
toujours retourné 0)
J'ai changé la déclaration:
Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA"
(ByVal lpEventAttributes As Any, ...) As Long
... et cela a fonctionné.
Maintenant, je suis un peu perplexe:
- Pourquoi le paramètre
ByRef
lors de l'utilisationSECURITY_ATTRIBUTES
mais doit êtreByVal
lors de l'utilisationAny
? - Pourquoi la déclaration incorrecte fonctionne-t-elle toujours dans l'EDI?
'ByVal ... As Any' est le cas le plus bizarre de déclaration de paramètres. – wqw