AllocateConsole() in VB.net(WinForms)

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    AllocateConsole() in VB.net(WinForms)

    Guten Morgen, ich mal wieder.

    Ich bräuchte dringend Hilfe beim hinzufügen einer Console in WinForms. Ich habe bisher folgenden Code:

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Collections.Generic
    3. Imports System.Runtime.InteropServices
    4. Public Class DOC
    5. Private lLogs As New List(Of String) 'Ich habe es einfach mal drinnen gelassen, kein weiterer Zweck. (?)
    6. Declare Function AllocConsole Lib "kernel32" () As Boolean
    7. Public Shared Sub Create() 'Erstellt die Console
    8. DOC.AllocConsole()
    9. End Sub
    10. Public Class Write
    11. Public Shared Sub Download(text As String) 'Gibt einen grünen Text aus
    12. Console.ForegroundColor = ConsoleColor.Green
    13. Console.WriteLine(" -> " + text)
    14. End Sub
    15. Public Shared Sub Log(text As String) 'Gibt einen gelben Text aus
    16. Console.ForegroundColor = ConsoleColor.Yellow
    17. Console.WriteLine(" -> " + text)
    18. End Sub
    19. End Class
    20. End Class


    Ich denke, es ist selbsterklärend. Ansonsten habe ich paar Kommentare hinterlassen. Ich habe bereits so viel Code ausprobiert und im Internet gesucht wie ein Affe, aber absolut gar nichts klappt für mich. Die Console wird zwar geöffnet, aber die Writefunktionen funktionieren einfach nicht. Da ich auch keine Exception erhalte, kann ich es auch mit meinem Wissen nicht Debuggen. Es wäre super, wenn mir jemand einen Anlauf zu dem ganzen geben könnte, ich lerne gerne neues dazu.

    Edit//: Die AllocConsole() Funktion wird in Form1 aufgerufen.
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Sekki“ ()

    Du musst den StandartOutput auch umleiten zur Console.

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. <DllImport("kernel32.dll")>
    4. Private Shared Function AllocConsole() As Boolean
    5. End Function
    6. <DllImport("kernel32.dll")>
    7. Private Shared Function GetStdHandle(ByVal nStdHandle As Integer) As IntPtr
    8. End Function
    9. <DllImport("kernel32.dll")>
    10. Private Shared Function SetStdHandle(ByVal nStdHandle As Integer, ByVal hHandle As IntPtr) As Boolean
    11. End Function
    12. Const STD_OUTPUT_HANDLE As Integer = -11
    13. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    14. If AllocConsole() Then
    15. If SetStdHandle(STD_OUTPUT_HANDLE, GetStdHandle(STD_OUTPUT_HANDLE)) Then
    16. Console.ForegroundColor = ConsoleColor.Green
    17. Console.WriteLine("Fluxoriert")
    18. End If
    19. End If
    20. End Sub
    21. End Class

    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

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

    @Nolde

    VB.NET-Quellcode

    1. <DllImport("kernel32.dll")>
    2. Private Shared Function AllocConsole() As Boolean
    3. End Function
    4. <DllImport("kernel32.dll")>
    5. Private Shared Function GetStdHandle(ByVal nStdHandle As Integer) As IntPtr
    6. End Function
    7. <DllImport("kernel32.dll")>
    8. Private Shared Function SetStdHandle(ByVal nStdHandle As Integer, ByVal hHandle As IntPtr) As Boolean
    9. End Function
    10. Const STD_OUTPUT_HANDLE As Integer = -11
    11. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    12. If AllocConsole() Then
    13. If SetStdHandle(STD_OUTPUT_HANDLE, GetStdHandle(STD_OUTPUT_HANDLE)) Then
    14. Console.ForegroundColor = ConsoleColor.Green
    15. Console.WriteLine("Fluxoriert")
    16. End If
    17. End If
    18. End Sub


    Leider funktioniert es nicht. Er startet die Console erneut ohne "Fluxoriert" auszugeben. Habe auch einmal "AllocConsole()" ausgeführt, funktioniert aber alles nicht. Ich benutze übrigens die Compile Einstellung [Debug : Any CPU] Ich habe es übrigens einfach kopiert und eingefügt, da ich keinen Grund sah den Code zu bearbeiten. Sollte ich etwas umschreiben müssen, bitte drauf Aufmerksam machen.
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.
    Keine Ahnung warum es bei dir nicht geht, bei mir klappts für AnyCpu, x86 und x64. Vllt. liegts am OS? Ich hab Win 7 Ultimate.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    NoIde schrieb:

    Keine Ahnung warum es bei dir nicht geht, bei mir klappts für AnyCpu, x86 und x64. Vllt. liegts am OS? Ich hab Win 7 Ultimate.


    Ich nutze Windows 10 Home. Vielleicht meldet sich ja noch jemand zu dem Thema. Wäre mal interessant zu wissen, ob es wirklich am Betriebssystem liegt.
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.
    @Sekki Teste mal dies, bei mir läuft es unter W7 und W10:
    Kommunikation zwischen Console und Form
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die Console-Zeilen von @NoIde (Anmerkung für @Sekki: NOIDE, mit I wie Informatik, nicht NOLDE) und @RodFromGermany landen bei meinem WinForms-Projekt nicht in der Console, sondern im Direktfenster.
    Win10, VS2017CE

    ##########

    Innerhalb von VS landet es im Direktfenster. In der Exe jedoch wie gewünscht in der Console.
    Bilder
    • WinFormsAndConsole.png

      7,96 kB, 403×173, 92 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Vllt. liegt es auch an einer Einstellung in Visual Studio, probiert mal meine Projektmappe.
    Dateien
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    RodFromGermany schrieb:

    @Sekki Teste mal dies, bei mir läuft es unter W7 und W10:
    Kommunikation zwischen Console und Form



    Um zu verhindern, dass ich ein Ergebnis durch meinen Fehler fälsche, habe ich mal den Code erneut so genutzt, wie du ihn dort aufgeführt hast. Hier kannst du das 7 sekundenlange Video sehen, welches ich dafür aufgenommen habe:
    gyazo.com/a07055801057014f74626b3216df7664

    Button1 führt super die Funktion zum Allocaten aus.
    Button2 führt absolut gar nichts aus(nichts im sichtbaren Bereich jedenfalls)
    Button3 führt super die Funktion zum delocaten(?) aus.

    Also liegt es anscheinend nicht am Code, sondern an etwas anderem. Hättet ihr vielleicht neue Ansätze oder vielleicht jetzt sogar schon eine Idee zu "Reparatur"?

    @VaporiZed
    Tatsächlich, dass ist mir gar nicht aufgefallen.

    @NoIde

    Leider funktioniert nicht mal dein Projekt(bei mir).
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.
    @NoIde: Auch mit Deinem Projekt bleibt es (bei mir) dabei: In VS geht's ans Direktfenster (Menü Debuggen -> Fenster -> Direkt), in der EXE an die Console.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich habe mal zum testen die Funktion .ReadLine() versucht und tatsächlich erwartet die Console von mir einen Input(ich kann was eintippen). Liegt es an .WriteLine? Das ist mal was neues, habe ich auch noch nicht erlebt haha.
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.

    RodFromGermany schrieb:

    @Sekki Poste mal Deinen Code.



    Der Code den ich genutzt habe ist der absolut selbe, den du mir gezeigt hast. Das sieht man in meiner GIF, ich habe dort nur den String von .WriteLine geändert, damit ihr das im Video seht, falls etwas ausgegeben wäre. Aber hier nochmal:

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. <DllImport("kernel32.dll")>
    4. Private Shared Function AllocConsole() As Boolean
    5. End Function
    6. <DllImport("kernel32.dll")>
    7. Private Shared Function GetStdHandle(ByVal nStdHandle As Integer) As IntPtr
    8. End Function
    9. <DllImport("kernel32.dll")>
    10. Private Shared Function SetStdHandle(ByVal nStdHandle As Integer, ByVal hHandle As IntPtr) As Boolean
    11. End Function
    12. Const STD_OUTPUT_HANDLE As Integer = -11
    13. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    14. If AllocConsole() Then
    15. If SetStdHandle(STD_OUTPUT_HANDLE, GetStdHandle(STD_OUTPUT_HANDLE)) Then
    16. Console.ForegroundColor = ConsoleColor.Green
    17. Console.WriteLine("==================")
    18. Dim meow As String = Console.ReadLine()
    19. MsgBox(meow)
    20. End If
    21. End If
    22. End Sub
    23. End Class


    In dem oben aufgeführten Code habe ich noch nachträglich "Console.ReadLine()" eingetragen um zu sehen, ob das funktioniert. Und wie ich bereits sagte, funktionier ReadLine anscheinend gut.

    Ansonsten findest du meinen originalen Code(den ich vor all den Nachrichten genutzt habe) im First Post.

    @NoIde
    Ja, dass dachte ich mir schon. Was kann es nur sein.. Ich nutze übrigens 2017 (Community)
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.

    Sekki schrieb:

    Der Code den ich genutzt habe ist der absolut selbe, den du mir gezeigt hast.
    Nur hast Du in Deinem Filmchen 3 Button ...
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich nutze noch VS2010 Express und VS2013 WD-Express. Funktioniert mit beiden IDE's.


    Edit: @Sekki
    Kann es sein das natives Debugging aktiviert sein muss? Das hatte ich mal bei mir angestellt. Wäre das einzige neben dem OS was mir noch einfällt.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    @RodFromGermany

    Entschuldige, dass war auch gar nicht dein Code. Ich habe unendlich viele Projekte grade offen, ich habe mich vertan. Ich meinte diesen Code:

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. <DllImport("kernel32", SetLastError:=True)>
    4. Private Shared Function AllocConsole() As Boolean
    5. End Function
    6. <DllImport("kernel32", SetLastError:=True)>
    7. Private Shared Function FreeConsole() As Boolean
    8. End Function
    9. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    10. If Not AllocConsole() Then
    11. ' anhängen der Konsole fehlgeschlagen
    12. End If
    13. End Sub
    14. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    15. Console.WriteLine("=======================================")
    16. Dim meow As String = Console.ReadLine()
    17. MsgBox(meow)
    18. End Sub
    19. Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    20. If Not FreeConsole() Then
    21. ' abhängen der Konsole fehlgeschlagen
    22. End If
    23. End Sub
    24. End Class


    @NoIde Hmm.. Dann weißt du wohl auch nicht mehr weiter.. :/
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.
    @Sekki Console.ReadLine() funktioniert in einer solch angehängten Console nicht, ggf. musst Du die aktuelle Zeile setzen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Kann es sein das natives Debugging aktiviert sein muss? Das hatte ich mal bei mir angestellt. Wäre das einzige neben dem OS was mir noch einfällt.

    Ich würde dann an deiner Stelle einfach eine Konsolenanwendung erstellen, diese mit dem Programm mit NamedPipes oder TCP kommunizieren lassen.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    RodFromGermany schrieb:

    @Sekki Console.ReadLine() funktioniert in einer solch angehängten Console nicht, ggf. musst Du die aktuelle Zeile setzen.



    VB.NET-Quellcode

    1. 'Wartet auf meinen Input und ich tippe was ein
    2. Dim meow As String = Console.ReadLine()
    3. 'Funktioniert nicht!
    4. Console.WriteLine(meow)
    5. 'Funktioniert(und ich erhalte den richtigen Output)
    6. MsgBox(meow)


    In dem Fall funktioniert Readline aber super. Also, falls du das gemeint hast.
    Und was meinst du mit aktuelle Zeile setzen?


    @NoIde
    Nein, leider liegt es nicht am nativen Debugging. Und ich würde mir doch lieber eine Lösung für die nicht funktionierende Console suchen. Über TCP usw ist mir dann wieder um eine Ecke zu weit gedacht.
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.