Was ist mit meiner Deklar -Erklärung schief gelaufen?
Frage
Ich habe kürzlich einen Fehler in einer VB6 -Anwendung behoben, aber ich bin mir nicht sicher, was genau schief gelaufen ist.
Der beleidigende Teil war eine falsche API -Erklärung von CreateEvent
. Dies ist, was der API -Betrachter generiert hat:
Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA"
(lpEventAttributes As SECURITY_ATTRIBUTES, ...) As Long
Der nächste ist der falsch Erklären Sie, offensichtlich wollte jemand das nicht importieren SECURITY_ATTRIBUTES
Struktur...
Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA"
(lpEventAttributes As Any, ...) As Long
Der Anruf war:
Event = CreateEvent(Nothing, 0, 0, "MyEventName")
Dieser Anruf funktionierte stets in der ide, aber noch nie Aus dem kompilierten .exe. (CreateEvent
immer zurückgegeben 0)
Ich habe die Erklärung geändert in:
Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA"
(ByVal lpEventAttributes As Any, ...) As Long
... und es hat funktioniert.
Jetzt bin ich ein bisschen verwirrt:
- Warum ist der Parameter
ByRef
beim BenutzenSECURITY_ATTRIBUTES
aber muss seinByVal
beim BenutzenAny
? - Warum hat die falsche Deklaration immer in der IDE funktioniert?
Lösung
Wenn Sie einen nicht qualifizierten Parameter verwenden, müssen Sie im Anruf explizit sein. Dies hätte das Problem beheben sollen:
Event = CreateEvent (Byval 0 &, 0, 0, "MyeventName")
Ich kann nicht sehen, warum Sie hier nichts verwenden würden, da dies eine Objektreferenz ist und der Anruf einen Zeiger erwartet. Was Byval 0 & tut, ist einen Nullzeiger zu passieren - da es Null ist, spielt es keine Rolle, worauf er (nicht) zeigt. Aber nichts zu bestimmen, zwingt Byval wahrscheinlich Byval 0 &, weshalb es funktioniert hat.
In Bezug auf die Frage, warum es in der IDE funktioniert hat, neigt die IDE dazu, solche Dinge zu verzeihen.