programma updaten naar nieuwe versie

Status
Niet open voor verdere reacties.

williewonka

Gebruiker
Lid geworden
5 aug 2011
Berichten
21
hallo allemaal,

Ik wil graag een programma maken die de output van de batch van de minecraft server 'vangt' en vervolgens aan de hand van deze output zelf commando's de batch insturen. Nou heb ik rond gezocht op google en een programma gevonden die eigenlijk een cmd prompt na-aapt. Het doet precies wat ik wil hebben. want als ik dit programma in de server map stop en de commandline geef om de server te starten ("java -Xmx2048M -Xms2048M -jar minecraft_server.jar" dit start ik normaal in een bat file) start hij keurig de server. De output wordt in het programma getoond en ik kan vanuit het programma commands geven. Maar nu het probleem: dit programma wil ik graag uitbreiden, het is echter geschreven in een oude versie ( ik denk 6 weet niet zeker) en ik heb versie 2008. Ik het het al geconverteerd met de wizard die bij visual basic wordt meegeleverd. de code is echter enorm veel rootzooi en er zit vele comments in het duits bij waar ik de helft niet van kan vertalen. Ik wil dit programma dus stroomlijnen en in 2008 programmeren. Ik heb een nieuw project gestart en alle belangrijke subs overgenomen (en overbodige dingetjes weggelaten die in 2008 niet hoeven zoals heel vaak een 'me.'). Ik heb nu dit in 2008:

Code:
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Globalization
Imports System.Text
Imports System.Threading
Imports System.Windows.Forms

Public Class console
    Dim process As Process
    Dim outputthread As Thread
    Dim texttoadd As String
    Dim errorthread As Thread
    Private Sub streaminput(ByVal input As String)
        process.StandardInput.WriteLine(Text)
        process.StandardInput.Flush()
    End Sub

    Private Function ConvertFromOem(ByVal input As String) As String
        Dim converted As String

        converted = Encoding.GetEncoding(CultureInfo.InstalledUICulture.TextInfo.OEMCodePage).GetString(Encoding.Default.GetBytes(Text))

        Return converted
    End Function

    Private Sub addtext(ByVal text As String)
        texttoadd = text
        Me.Invoke(CType(AddressOf addtexttotextbox, MethodInvoker))
    End Sub

    Private Sub addtexttotextbox()
        txtoutput.AppendText(texttoadd & ControlChars.NewLine)
        txtoutput.SelectionStart = txtoutput.Text.Length
    End Sub

    Private Sub streamoutput()
        Dim line As String = process.StandardOutput.ReadLine
        Try
            Do While line.Length >= 0
                If line.Length > 0 Then
                    addtext(ConvertFromOem(line))
                End If
                line = process.StandardOutput.ReadLine()
            Loop
        Catch
            addtext("cmd prompt ended")
        End Try
    End Sub

    Private Sub streamerror()
        Dim line As String = process.StandardError.ReadLine()

        Try
            Do While line.Length >= 0
                line = process.StandardError.ReadLine()
                If line.Length > 0 Then
                    addtext(line)
                End If
            Loop
        Catch

            addtext("cmd prompt ended!")
            MsgBox("cmd prompt ended!")

        End Try
    End Sub

    Private Sub console_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        If Not process.HasExited Then
            process.Kill()
        End If
        process.Close()
    End Sub

    Private Sub console_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        process = New Process

        With process.StartInfo
            .FileName = "cmd"
            .UseShellExecute = False
            .CreateNoWindow = True
            .RedirectStandardOutput = True
            .RedirectStandardError = True
            .RedirectStandardInput = True
        End With

        process.Start()

        outputthread = New Thread(AddressOf streamoutput)
        outputthread.IsBackground = True
        outputthread.Start()
        errorthread = New Thread(AddressOf streamerror)
        errorthread.IsBackground = True
        errorthread.Start()
    End Sub

    Private Sub btzenden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btzenden.Click
        streaminput(txtinput.Text)
        txtinput.Clear()
    End Sub
End Class

En dit is de oude code:
Code:
Option Compare Binary
Option Explicit On 
Option Strict On

Imports Microsoft.VisualBasic
Imports System
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Globalization
Imports System.Text
Imports System.Threading
Imports System.Windows.Forms

''' <summary>
'''   Hauptformular des Programms.
''' </summary>
Public Class MainForm
    Inherits System.Windows.Forms.Form

    Private m_Process As Process
    Private m_OutputThread As Thread
    Private m_ErrorThread As Thread
    Private m_TextToAdd As String

#Region " Windows Form Designer generated code "
    Public Sub New()
        MyBase.New()
        InitializeComponent()
    End Sub

    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    Private components As System.ComponentModel.IContainer

    Friend WithEvents txtCommandInput As System.Windows.Forms.TextBox
    Friend WithEvents txtConsole As System.Windows.Forms.TextBox
    Friend WithEvents btnSend As System.Windows.Forms.Button

    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Me.txtCommandInput = New System.Windows.Forms.TextBox
        Me.btnSend = New System.Windows.Forms.Button
        Me.txtConsole = New System.Windows.Forms.TextBox
        Me.SuspendLayout()
        '
        'txtCommandInput
        '
        Me.txtCommandInput.Anchor = CType(((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left) _
                    Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
        Me.txtCommandInput.Location = New System.Drawing.Point(16, 352)
        Me.txtCommandInput.Name = "txtCommandInput"
        Me.txtCommandInput.Size = New System.Drawing.Size(462, 20)
        Me.txtCommandInput.TabIndex = 1
        '
        'btnSend
        '
        Me.btnSend.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
        Me.btnSend.FlatStyle = System.Windows.Forms.FlatStyle.System
        Me.btnSend.Location = New System.Drawing.Point(486, 350)
        Me.btnSend.Name = "btnSend"
        Me.btnSend.Size = New System.Drawing.Size(64, 24)
        Me.btnSend.TabIndex = 2
        Me.btnSend.Text = "&Senden"
        '
        'txtConsole
        '
        Me.txtConsole.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
                    Or System.Windows.Forms.AnchorStyles.Left) _
                    Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
        Me.txtConsole.Font = New System.Drawing.Font("Courier New", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.txtConsole.Location = New System.Drawing.Point(16, 16)
        Me.txtConsole.Multiline = True
        Me.txtConsole.Name = "txtConsole"
        Me.txtConsole.ReadOnly = True
        Me.txtConsole.ScrollBars = System.Windows.Forms.ScrollBars.Both
        Me.txtConsole.Size = New System.Drawing.Size(534, 326)
        Me.txtConsole.TabIndex = 3
        '
        'MainForm
        '
        Me.AcceptButton = Me.btnSend
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(568, 390)
        Me.Controls.Add(Me.txtConsole)
        Me.Controls.Add(Me.btnSend)
        Me.Controls.Add(Me.txtCommandInput)
        Me.MinimumSize = New System.Drawing.Size(576, 424)
        Me.Name = "MainForm"
        Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
        Me.Text = "RedirectConsole"
        Me.ResumeLayout(False)
        Me.PerformLayout()

    End Sub
#End Region

    ''' <summary>
    '''   Schreibt den im Parameter <paramref name="Text"/> angebenen Text
    '''   auf den Ausgabestrom.
    ''' </summary>
    ''' <param name="Text">
    '''   Text, der auf den Ausgabestrom geschrieben werden soll.
    ''' </param>
    Private Sub StreamInput(ByVal Text As String)
        m_Process.StandardInput.WriteLine(Text)
        m_Process.StandardInput.Flush()
    End Sub

    ''' <summary>
    '''   Konvertiert den Text in <paramref name="Text"/> von der DOS-
    '''   Codepage (OEM) in die Windows-Codepage (ANSI).
    ''' </summary>
    ''' <param name="Text">Text, der konvertiert werden soll.</param>
    ''' <returns>
    '''   Der Text aus <paramref name="Text"/> in der aktuellen Windows-
    '''   Codepage.
    ''' </returns>
    Private Function ConvertFromOem(ByVal Text As String) As String
        Return _
            Encoding.GetEncoding( _
                CultureInfo.InstalledUICulture.TextInfo.OEMCodePage _
            ).GetString(Encoding.Default.GetBytes(Text))
    End Function

    ''' <summary>
    '''   Liest vom Ausgabestream und gibt die gelesenen Informationen aus.
    ''' </summary>
    Private Sub StreamOutput()
        Dim Line As String = m_Process.StandardOutput.ReadLine()
        Try
            Do While Line.Length >= 0
                If Line.Length > 0 Then
                    AddText(ConvertFromOem(Line))
                End If
                Line = m_Process.StandardOutput.ReadLine()
            Loop
        Catch
            AddText(String.Format("cmd prompt ended!", m_Process.StartInfo.FileName))
        End Try
    End Sub

    ''' <summary>
    '''   Liest vom Fehlerstream und gibt die gelesenen Informationen aus.
    ''' </summary>
    Private Sub StreamError()
        Dim Line As String = m_Process.StandardError.ReadLine()
        Try
            Do While Line.Length >= 0
                Line = m_Process.StandardError.ReadLine()
                If Line.Length > 0 Then
                    AddText(Line)
                End If
            Loop
        Catch
            AddText(String.Format("cmd prompt ended!", m_Process.StartInfo.FileName))
            MsgBox("cmd prompt closed!")
        End Try
    End Sub

    ''' <summary>
    '''   Fügt den im Parameter <paramref name="Text"/> übergebenen String
    '''   einer TextBox an.
    ''' </summary>
    ''' <param name="Text">
    '''   Text, der der TextBox hinzugefügt werden soll.
    ''' </param>
    Private Sub AddText(ByVal Text As String)
        m_TextToAdd = Text
        Me.Invoke(CType(AddressOf Me.AddTextToTextBox, MethodInvoker))
    End Sub

    ''' <summary>
    '''   Wird über Invoking aufgerufen, um einen Text hinzuzufügen.
    ''' <summary>
    Private Sub AddTextToTextBox()
        Me.txtConsole.AppendText(m_TextToAdd & ControlChars.NewLine)
        Me.txtConsole.SelectionStart = Me.txtConsole.Text.Length
    End Sub

    Private Sub MainForm_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load

        ' Um das Programm zu benutzen, um einen Befehl auf der
        ' Konsole auszuführen (z.B. "netstat" oder "ping") kann man
        ' anstelle von "cmd" bei Arguments einfach den entsprechenden
        ' Befehl (z.B. "ping") einfügen und in der Eigenschaft 'Arguments'
        ' die entsprechenden Argumente (beispielsweise bei "ping" die IP-
        ' Adresse) angeben.
        m_Process = New Process
        With m_Process.StartInfo
            .FileName = "cmd"
            .UseShellExecute = False
            .CreateNoWindow = True
            .RedirectStandardOutput = True
            .RedirectStandardError = True
            .RedirectStandardInput = True
        End With
        m_Process.Start()

        ' Ändern der Datenströme, sodass wir bei Änderungen etwas mitbekommen.
        m_OutputThread = New Thread(AddressOf StreamOutput)
        m_OutputThread.IsBackground = True
        m_OutputThread.Start()
        m_ErrorThread = New Thread(AddressOf StreamError)
        m_ErrorThread.IsBackground = True
        m_ErrorThread.Start()
    End Sub

    Private Sub btnSend_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSend.Click
        StreamInput(Me.txtCommandInput.Text)
        Me.txtCommandInput.Clear()
    End Sub

    Private Sub MainForm_Closing(ByVal sender As Object, ByVal e As CancelEventArgs) Handles MyBase.Closing
        If Not m_Process.HasExited Then
            m_Process.Kill()
        End If
        m_Process.Close()
    End Sub
End Class

ik krijg geen errors in visual basic. Als ik echter de programma's test draai krijg ik dit bij de oude:

Microsoft Windows [versie 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Alle rechten voorbehouden.

en kan ik netjes dos commando's invoeren en krijg ik ook de output (minecraft server werkt ook)

maar als ik mijn programma draai krijg ik dit:

mc_server_control
mc_server_control

ik heb alles letter voor letter nagekeken en alle belangrijke code is hetzelfde. weet iemand wat ik fout doe? alvast hartelijk bedankt.

ps: ja ik heb gegoogled en nee ik kan de oude maker niet contacteren want het was een topic uit 2006 of zo en ik kan niet meer reageren.
 
Ik snap er niet zo veel van.

Je hebt een minecraft server.

Een bukkit lijkt me en je wilt de commands laten besturen via visual basic?
 
ja sorry dat had ik erbij moeten zetten. Ik heb dus een vanilla server en geen bukkit. dit doe ik omdat ik graag de mods buildcraft en redpower 2 pr wil gebruiken. deze hebben beide geen tot matige bukkit support. Ik vind vanilla dus veel handiger. Ik wil nu wel bepaalde plugins die bukkit heeft (zoals stemmen voor kick en random berichten) maar dan in de vanilla. Daarom wil ik een programma schrijven in visual basic. Is het zo duidelijker?
 
Laatst bewerkt door een moderator:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan