Visual Basic Fehler oder "Programmier" Fehler?

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von mrwebber.

    Visual Basic Fehler oder "Programmier" Fehler?

    Hallo Leute... Ich habe eine Frage zu Visual Basic (Ich benutze Visual Studios 2012 Express). Und zwar habe ich folgendes Problem. Ich erstelle beim Starten eine Datei die dazu dient, dass wenn das Programm gestartet ist, dass man es nicht nocheinmal starten kann... Hier einmal mein Code: (der der Fehlerhaft ist... -.-)

    VB.NET-Quellcode

    1. Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    2. If IsRunning = True Then
    3. If File.Exists(Application.StartupPath & "\LOCK") Then
    4. File.Delete(Application.StartupPath & "\LOCK")
    5. End If
    6. End If
    7. MsgBox("Finished ^^") 'Dient NUR zur Überprüfung weil ich nicht weiter wusste...
    8. End Sub
    9. 'Internet Checken und Update downloaden
    10. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    11. If File.Exists(Application.StartupPath & "\LOCK") Then
    12. If MessageBox.Show("Das Programm ist bereits ausgeführt worden!" & vbCrLf _
    13. & "Bitte schließen sie die ausgeführte Anwendeung," & vbCrLf _
    14. & "um eine neue zu starten.", "Das Programm Läuft schon." _
    15. , MessageBoxButtons.OK, MessageBoxIcon.Warning) = Windows.Forms.DialogResult.OK Then
    16. Me.Close()
    17. End If
    18. Me.Close()
    19. Else
    20. File.Create(Application.StartupPath & "\LOCK")
    21. IsRunning = True
    22. End If
    23. IsRunningCheck()
    24. Control.CheckForIllegalCrossThreadCalls = False
    25. panelloc.Y = "-210"
    26. panelloc.X = "289"
    27. panelClock.Location = panelloc
    28. panelClock.Visible = True
    29. Exit Sub
    30. End Sub
    31. 'Internet Checken und Update Info geben
    32. Private Sub IsRunningCheck()
    33. If IsRunning = True Then
    34. Argchecknow()
    35. End If
    36. End Sub
    37. Private Sub Argchecknow()
    38. Dim args As String()
    39. args = Environment.GetCommandLineArgs()
    40. 'bei 1 starten, weil das Programm IMMER seinen eigenen
    41. 'FULLPATH als ersten Parameter erkennt!
    42. For i As Integer = 1 To args.Length - 1
    43. Select Case args(i).ToLower
    44. Case "/?", "/help", "/info"
    45. MessageBox.Show("Your computer name: " & My.Computer.Name & vbCrLf _
    46. & "Date and Time: " & Now & vbCrLf _
    47. & "Known args: " & vbCrLf _
    48. & "/? /help /info" & vbCrLf _
    49. & "/media" _
    50. , "", MessageBoxButtons.OK, MessageBoxIcon.Information)
    51. Me.Close()
    52. Case "/media"
    53. For i2 As Integer = 2 To args.Length - 1
    54. Player.WMPlayer.URL = args(i2)
    55. Player.ListBox1.Items.Add(Path.GetFileName(args(i2)))
    56. Player.ListBox2.Items.Add(args(i2))
    57. Next
    58. Me.Visible = False
    59. Me.ShowInTaskbar = False
    60. 'Player.FromArg = True
    61. Player.Show()
    62. Case Else
    63. End Select
    64. Next
    65. AllINet.Start()
    66. Exit Sub
    67. End Sub


    Der Fehler passiert nur wenn ich im CMD das Programm mit argumenten starte. Nicht beim Start dierekt, sondern wenn das Programm beginnt sich zu schließen. Z.B. sieht das im CMD so aus:
    C:\Users\%USERPROFILE%\Desktop>Leaders4Fun.exe /?
    Dann funktioniert auch alles. Es wird mein Benutzer ausgegeben, Zeit und die befehle. Aber sobald ich auf "OK" Klicke kommt folgende Meldung:

    Quellcode

    1. Eine nicht behandelte Ausnahme des Typs "System.IO.IOException" ist in mscorlib.dll aufgetreten.
    2. Zusätzliche Informationen: Der Prozess kann nicht auf die Datei
    3. "G:\Programme\Pfad\zum\Programm\bin\Debug\LOCK" zugreifen,
    4. da sie von einem anderen Prozess verwendet wird.

    Ich habe versucht sie im Explorer zu löschen, bekomme dann die meldung das sie von vshost32.exe benutzt wird (Ist doch VS2012E oder nicht?).
    Wenn ich das Programm von der .exe und nicht über VS2012E starte bekomme ich diese Meldung (bei den selben Argumenten):

    Quellcode

    1. Unbehandelte Ausnahme in der Anwendung. Klicken sie auf "Weiter"
    2. un den Fehler zu ignorieren und die Anwendung fortzusetzen. Wenn Sie
    3. auf "Beenden" klicken, wird die Anwendung sofort beendet.
    4. Der Prozess kann nicht auf die Datei
    5. "G:\Programme\Pfad\zum\Programm\bin\Debug\
    6. LOCK" zugreifen, da sie von einem anderen Prozess verwendet wird.
    7. Details:
    8. Informationen über das Aufrufen von JIT-Debuggen
    9. anstelle dieses Dialogfelds finden Sie am Ende dieser Meldung.
    10. ************** Ausnahmetext **************
    11. System.IO.IOException: Der Prozess kann nicht auf die Datei "G:\Programme\Pfad\zum\Programm\bin\Debug\LOCK" zugreifen, da sie von einem anderen Prozess verwendet wird.
    12. bei System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
    13. bei System.IO.File.InternalDelete(String path, Boolean checkHost)
    14. bei System.IO.File.Delete(String path)
    15. bei Leaders4Fun.Form1.Form1_FormClosing(Object sender, FormClosingEventArgs e) in G:\Programme\Pfad\zum\Programm\Form1.vb:Zeile 152.
    16. bei System.Windows.Forms.Form.OnFormClosing(FormClosingEventArgs e)
    17. bei System.Windows.Forms.Form.WmClose(Message& m)
    18. bei System.Windows.Forms.Form.WndProc(Message& m)
    19. bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    20. bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    21. bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


    Die 2. Meldung kommt 2 mal und dann meine normale Form. Allerdings kommt dann sofort die Meldung "Leaders4Fun.exe funktioniert nicht mehr."

    Ich bitte um hilfe ;( Ich weiß einfach nicht mehr weiter und weiß nicht wie ich das sonst machen soll...
    Ich hoffe ihr könnt mir meinen ersten Post (Gramatikalisch und Rechtschreib mäßig) verzeihen und Ich hoffe das ich das in einem Richtigen Thread gepostet habe. ^^

    Vielen Dank und liebe Grüße von
    KenJy ^^
    Bellum et Pax.
    Omne initium est difficile.
    -KenJy ;D
    Wenn du das Anwendungsframework aktiviert hast kannst du einfach durch einen Haken bei "Einzelinstanzanwendung erstellen" verhindern, dass das Programm mehr als einmal gestartet wird. Wenn du es nicht aktiviert hast regelt man sowas normalerweise mit einem Mutex (einfach mal suchen).
    O_O Ähhhmmm... Habe ich vergessen zu erwähnen dass ich noch ein Anfänger bin? Ich weiß nicht einmal wo ich das finden kann, geschweige denn, wusste ich nicht einmal dass es das gibt... ._. Das selbe bei "Mutex". Ich kann es gerne mal suchen.
    Vllt. hilft es mir...
    Bellum et Pax.
    Omne initium est difficile.
    -KenJy ;D
    Hallo,

    du musst (siehe Anhang) auf My Project gehen und dann
    müssen 'Anwendungsframework aktivieren' und 'Einzelinstanzanwendung erstellen'
    anschalten.

    MFG

    Alex-Digital :D
    Bilder
    • BildHilfe.PNG

      78,55 kB, 1.437×656, 209 mal angesehen
    ~ Alex-Digital :D

    if(!Internet.VBP.Get<User>("Alex-Digital").IsOnline) this.Close(); :D
    Ich will dich ja nicht nerven, aber: "Ungeschreibenes Bit"? 8o
    Wenn ein Bit existiert, muss es nicht erst "beschrieben" werden, dass es den Wert 0 hat...
    Stell' dir einen Schalter(Öffner/Schliesser) vor, der "keinen" Zustand hat... :whistling: ^^
    Jaaa... soll eig so sein, weil es unlogisch ist. So etwas existiert ja nicht. Also exsistiert auch mein Wissen nicht (so rum sollte das sein). Aber Logisch ist es in keinster weise... ;P Es kann sonst auch "Eine ausgeschaltete (Fest-)Platte" sein. Sie funktioniert auch nicht. ^^ (Ich glaub ich rede und denke zu unlogisch ;P )
    Bellum et Pax.
    Omne initium est difficile.
    -KenJy ;D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „KenJy_L4F“ ()

    BTW:

    Diese Zeile

    VB.NET-Quellcode

    1. Control.CheckForIllegalCrossThreadCalls = False


    sollte unbedingt verschwinden.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Genauso wie das :

    VB.NET-Quellcode

    1. panelloc.Y = "-210"
    2. panelloc.X = "289"

    panelloc.Y und panelloc.Y sind kein String ... sondern Integer

    MFG BlackNetworkBit
    MFG 0x426c61636b4e6574776f726b426974
    InOffical VB-Paradise IRC-Server
    webchat.freenode.net/
    Channel : ##vbparadise

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BlackNetworkBit“ ()

    @ SpaceyX
    Das diese Zeile:

    VB.NET-Quellcode

    1. Control.CheckForIllegalCrossThreadCalls = False

    Da steht, hatt seinen grund.
    Komischer weise kann ich sonst keine Threads starten.

    Und was bewirkt nochmal gleich

    VB.NET-Quellcode

    1. OPTION STRICT ON

    Habe das schon mal gehört und mal gelesen was das ist. Dachte mir nur: "Oh... wenn ich dass mach, funktioniert mein Programm nicht mehr... ._."

    @ BlackNetworkBit
    Jaaaaaaa... hab ich vergessen... Sorry... :P :D
    Bellum et Pax.
    Omne initium est difficile.
    -KenJy ;D
    Zu den IllegalCrossThreadCalls: Wenn du diesen Check wieder aktivierst, was genau funktioniert dann nicht? Es lässt sich immer ordentlich lösen. (Grundregel 1, die man erst sehr spät akzeptiert, wenn man mehr Befehle kennt)

    Option Strict bedeutet, dass unsauberes Programmieren nicht mehr erlaubt wird.
    Wie oben z.B.:

    VB.NET-Quellcode

    1. Dim iEineZahl As Integer = "5"


    Bei Option Strict Off "funktioniert" das. 5 ist schließlich eine Zahl und dieser String, den du hier zuweist, wird automatisch in Integer konvertiert.
    Da "5" aber ein String ist, könnte da genauso gut "a" stehen:

    VB.NET-Quellcode

    1. Dim iEineZahl As Integer = "a"


    Und das weiß Visual Basic während der Laufzeit nicht (ob da eine "5" oder ein "a" oder "das hier ist ein Satz" steht).
    Stell dir vor:

    VB.NET-Quellcode

    1. Dim iEineZahl As Integer = TextBox1.Text


    TextBox1.Text ist genauso ein String, wie "5" oder "a". Nur hier kann gut nachvollziehen, dass es während dem Programmieren nicht garantiert werden kann, dass in dem Textfeld auch wirklich ein Zahl drin steht.
    In Zahlenvariablen (hier: Datentyp Integer) sollten also immer nur Werte zugewiesen werden, die auch wirklich eindeutig Zahlen sind ...

    Machst du also Option Strict On (was für Anfänger sehr zu empfehlen ist, und für fortgeschrittene auch noch), dann ist Visual Studio so nett und markiert dir unsaubere Codestellen auch als Fehler.
    Vielleicht macht es keinen Sinn mehr das im Nachhinein bei dir zu aktivieren, weil dann zu viele Fehler auf einmal entstehen und du den Überblick verlierst.
    Es ist aber dennoch wirklich sehr ratsam, das ab jetzt für die neuen Projekte einzuschalten und entstehende Fehler gleich zu beheben.

    lg
    MrWebber

    EDIT:

    Richtig wäre es hier natürlich, der Integer-Variable gleich einen Integer-Wert zuzuweisen:

    VB.NET-Quellcode

    1. Dim iEineZahl As Integer = 5

    Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
    Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
    :thumbsup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mrwebber“ ()