# Ein paar Probleme mit "kernel32.dll"



## Deadman666 (10. August 2007)

Hallo zusammen, ich bin wiedermal auf ein paar Probleme gestossen.

Also ich hab mir von hier:
http://www.vbaccelerator.com/home/VB/Code/Controls/Menus/Icon_Menu_Control/article.asp

"IconMenu Control" runtergeladen und in mein Projekt eingefügt, so wie ichs gern hätte. Funktioniert alles wunderschön mit Icons im Menü, wenn ichs mit VB im Testmodus teste. Auch nach dem Compilieren und starten der .ExE ist das ganze kein Problem. Doch soblad ich die .ExE beende, bekomm ich nen "kernel32.dll" Fehler.

Hier der Unload Prozess meines Projekts:

```
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

Call UnloadAllForms

End

End Sub

Public Sub UnloadAllForms()

Dim oFrm As Form

For Each oFrm In Forms
    Unload oFrm
Next

End Sub
```

Hier die Problemsignatur:


> AppName: sng script console v3.0.exe	 AppVer: 3.0.0.0	 ModName: kernel32.dll
> ModVer: 5.1.2600.2180	 Offset: 0001eb33





> Fehlgeschlagene Anwendung sng script console v3.0.exe, Version 3.0.0.0, fehlgeschlagenes Modul kernel32.dll, Version 5.1.2600.2180, Fehleradresse 0x0001eb33.
> 
> Weitere Informationen über die Hilfe- und Supportdienste erhalten Sie unter http://go.microsoft.com/fwlink/events.asp.



Hatte so ein ähliches oder das gleiche Problem schon bei dem hier:
http://www.vbaccelerator.com/home/v...sing/Tile_a_Bitmap_Into_a_TextBox/article.asp

PS: Ich weiss das es am Icon Menü liegt, da ichs mit & ohne getestet hab. Mit = Fehler, Ohne = Ohne Fehler.

Schonmal danke für alle Hilfe


----------



## Alex F. (10. August 2007)

Also das Problem liegt nur indirekt am Menu.

Du machst folgendes 
im Form unload rufst du eine Funktion auf die alle Forms entlädt das Problem dabei ist, das auch die aufrufende Form dabei entladen wird, was aber nur bedingt geht denn eigentlich findet hier noch was statt ( auch wenn es nur ein exit sub ist ) 

Lösung: 
1 Setze dir eine formglobale Variable in der du beim zweiten mal das Cancel gleich true setzt 

die schönere Lösung :
2 starte deine Form über ein sub main modul und entlade alle formen nachdem deine Hauptform geschlossen wurde

Bsp: 


```
Public sub main ()
      load( hauptform) 
      hauptform.show vbmodal 


      for each f in forms 
           f.unload 
      next f 
end sub
```

beachte das Forms die nicht geladen sind aber in deiner Forms collection enthalten sind dummerweise implizit geladen werden um dann das unload auszuführen. Dies kann dazu führen, das dein Prog evtl. etwas länger im Speicher bleibt als nötig 

Grüsse bb


----------



## Deadman666 (10. August 2007)

Danke für die schnelle Antwort. Ich habe die 2te Lösung probiert, ist bei mir jedoch fehlgeschlagen (immernoch gleiche Fehlermeldung). Ich hoffe ich hab das richtig verstanden, denn ich hab ein Modul mit dem von dir gegeben Beispiel erstellt (Hauptform in meine Hauptform geändert, und das Modul anstatt "UnloadAllForms" beim beenden der Hauptform aufgerufen.

Ich hab auch noch folgendes probiert:
- Ohne Form_QueryUnload Event -> Programm bleibt im TaskManager, muss sich also von Hand beenden lassen
- Ohne UnloadAllForms Aufruf im Form_QueryUnload Event -> Fehler
- Ohne End Aufruf im Form_QueryUnload Event -> Programm bleibt im TaskManager und Hauptform bleibt sichtbar

PS:
Ich habe bei all den anderen Forms folgendes gemacht:

```
Private Sub Form_QueryUnload(Cancel As Integer)

Cancel = True

Me.Hide

End Sub
```

In der Hauptform werden die Forms dann einfach so "geladen":

```
Form.Show
```

Dies soll einfach verhindern, dass wenn man was bei einer Form eingibt und die Form dann schliesst und neu öffnet, das die eingegeben Daten usw. auf der Form erhalten bleiben.


----------



## Alex F. (10. August 2007)

also folgendes noch:

1. du musst natürlich die Sub main in den Starteinstellungen festlegen. 
2. wenn du die forms visible = false setzt werden sie nicht endladen und bleiben bis zu einem End im speicher
 also mach nach dem endladen der Formen -> also nach der schleife ein end 

3. wenn du Cancel immer auf true setzt werden deine Formen nie entladen.

Grüsse bb


----------



## Deadman666 (10. August 2007)

Ich bekomms irgentwie nicht so hin :/. Könnte ich dich eventuell irgentwie anders über nen Chat Messenger kontaktieren, oder dir meine Source schicken?


----------



## CrimeTime (10. August 2007)

Hallo Deadman,
versuch mal bitte diese Endfunktion.

Erstelle ein Modul mit dem name EndAll und diesen code drinne

```
Public Sub EndAll()
Dim frm As Form

For Each frm In VB.Forms
    Unload frm
    Set frm = Nothing
Next frm

End Sub
```


und dies hier in die Form wo es beendet wird bzw. FrmMain oder so, es wird dann eine frage gestellt ob er beenden möchte, sobald er ja drückt wird alles geschlossen.



```
Private Sub Form_Unload(Cancel As Integer)
  Dim Antwort As String
  
  Antwort = MsgBox("Are You Sure You Wish to Exit?", _
    vbExclamation + vbYesNo, "Attention!")
  
If Antwort = vbNo Then
      Cancel = True
  ElseIf Antwort = vbYes Then
    EndAll
  End If
End Sub
```

Gruß 

CrimeTime


----------



## Deadman666 (10. August 2007)

Ich habs nun so gemacht wie du CrimeTime gesagt hast. Nach dem Klick auf Yes bei der MsgBox verschwindet zwar das Programm, jedoch läuft der Prozess im Task Manager weiter. Habs auch schon probiert mit nach dem Aufruf von "EndAll" "End" aufzurufen, Resultat ist wiedermal der kernel32.dll Fehler. Also ist es der Aufruf der "End" Funktion, die zum Fehler führt.


----------



## Alex F. (15. August 2007)

Da fehlt ja auch wie ich oben schon beschrieben habe das end

BSP:


```
Public Sub EndAll()
Dim frm As Form

For Each frm In VB.Forms
    Unload frm
    Set frm = Nothing
Next frm
'Jetzt
END
End Sub
```


----------

