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 Benutzen SECURITY_ATTRIBUTES aber muss sein ByVal beim Benutzen Any?
  • Warum hat die falsche Deklaration immer in der IDE funktioniert?
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top