Laden...
S
Stefan7907
myCSharp.de - Member
5
Themen
10
Beiträge
Letzte Aktivität
vor 5 Monaten
Dabei seit
20.12.2023
Alter
34
Erstellt vor 6 Monaten

Hallo,

ich habe ein kleines Problem das ich nicht verstehe. Ich habe ein Process das ein Kommandozeilentool aufruft. Es funktioniert soweit ganz gut, allerdings kann ich die Daten aus dem Kommandozeilentool nur lesen wenn ich den StandartInput schließe mit proc.StandardInput.Close();. Das Problem ist, das ich dann natürlich keine neuen Befehle an das Tool schicken kann. Ich möchte aber auf die Ausgaben reagieren und dann etwas dahin schicken. Ich habe das ein paar mal ausprobiert, sobald der StandartInput geschlossen wird, kommen die Daten.

Habe ich da einen Denkfehler oder kann mir einer erklären warum der StandartInput den Output blockiert?

MFG

private void Test4()
       {
           var proc = new Process
           {
               StartInfo = new ProcessStartInfo
               {
                   FileName = "C:\\Program Files (x86)\\Elprotronic\\MSP430\\FET-Pro430\\CMD-Line\\FP430-commandline.exe",
                   UseShellExecute = false,
                   RedirectStandardOutput = true,
                   RedirectStandardInput = true,
                   CreateNoWindow = false
               }
           };
           proc.Start();
           StringBuilder sb = new StringBuilder();
           var outStream = proc.StandardOutput;
           var inStream = proc.StandardInput;
           inStream.WriteLine("help()");
           List<string> lines = new List<string>();
           Task.Run(() =>
           {
               while (true)
               {
                   Console.WriteLine(outStream.ReadLine());
                   lines.Add(outStream.ReadLine());
               }
           });
           var timer = new Stopwatch();
           timer.Start();
           bool ProgResult = false;
           inStream.WriteLine("F_Initialization()");
           proc.StandardInput.Close();
           while (!ProgResult)
           {
               Thread.Sleep(100);
               //Print Results
               tb_programmingInfo.Text = String.Join(" \r\n - ", lines.ToArray());
               tb_programmingInfo.Update();
               //Abort Function
               TimeSpan timeTaken = timer.Elapsed;
               if (timeTaken.TotalSeconds > 10 || lines.Count() > 100)
                   ProgResult = true;
           }
           timer.Stop();
           //proc.StandardInput.Flush();
           //proc.StandardInput.Close();
           proc.WaitForExit(2000);
           if (!proc.HasExited)
               proc.Kill();
       }
Erstellt vor einem Jahr

Hallo,

ich hab ein Problem mit der referenz zur einer Variable.

Ich habe eine Variable (prodData) die ich in eine Funktion übergebe:

using static Programming.FormInterface;

public errorCode programProfinet(ref productionData prodData)

In dieser Funktion möchte ich die Variable in eine andere Variable speichern und gewissen Sachen darin verändern.

    productionData prodDataProfinet = new productionData();
    prodDataProfinet = prodData;
    prodDataProfinet.prodSW = null;

Aber die Basis-Variable prodData wird dabei auch verändert. Kann mir jemand erklären wieso das passiert? Ich mache doch gar nichts mit der Variablen, wieso ist die mit der neuen Variablen verbunden und wie kann ich diese Verbindung aufheben?

Erstellt vor einem Jahr

Oder ist es möglich Einfluss darauf zu nehmen, wie die DLL später aufgerufen wird? Weil scheinbar, wenn die DLL von einem dritt Programm aufgerufen wird was keine Visual Studio Anwendung ist, funktioniert es ja nicht mehr. Da würde ich davon ausgehen das diese Anwendung dann die DLL nicht mehr als x64 oder x86 aufrufst, oder liege ich da falsch?

Erstellt vor einem Jahr

Danke für die schnelle Antwort. Als ich den Begriff "Working Directory" gelesen habe, ist es mir auch direkt wieder eingefallen.

Das Thema mit der Prozessverwaltung und die Shell von Windows habe ich noch nicht ganz verstanden. Ich habe mein Tool jetzt auch so umgestellt das ich kein Batch-File mehr nutze sondern einfach die cmd.exe. Die hat aber das selbe Problem. Aber ich wollte von dem Batch-File Abstand gewinnen, damit es allgemeiner ist. 
Kannst du mir zu der WOW64 oder zu dem Thema allgemein vielleicht ein paar mehr Infos geben? Ist das WOW64 eine Möglichkeit eine 32-Bit Anwendung vorzugeben damit er das in dieser Version starten muss?

Erstellt vor einem Jahr

Hallo,

ich habe eine DLL geschrieben in der ich ein .Batchfile aufrufe und eingaben dahin schicke. Das Funktioniert auch sehr gut. Ich musste dafür aber im Konfigurationsmanager die Plattform von "Any CPU" auf "x64" ändern damit es funktioniert. Das konnte ich mir bisher auch noch nicht erklären.

Wenn ich den Pfad des Batch-Files jetzt aber auf eine andere Festplatte festlege, dann funktioniert es nicht mehr. Kann mir jemand erklären wieso das so ist? (Der Pfad passt und da gibt es keinen Fehler das dieser falsch wäre). Die Datei liegt neu im "öffentlich" Ordner, wo die Zugriffsrechte passen sollten.

Gruß

Stefan

Erstellt vor einem Jahr

Hallo,

Danke für die schnellen Antworten. Es lag am Gerät selbst, vielen Dank für die Hilfe.

Erstellt vor einem Jahr

Hallo,

ich habe eine dll geschrieben, in der ich eine Serielle Kommunikation betreibe. Aus einer Gui lassen sich die Befehle über die dll auch ansteuern und ich bekomme auch meine Daten zurück. Jedoch bricht die Kommunikation konstant nach 40 Sekunden ein. Es bringt auch nichts kontienuirlich Nachrichten zu schicken und eine Antwort zu erhalten.

Kann das mit dem Garbage Collector zusammenhängen, das der meine Funktion oder wichtige Teile davon nach 40s abräumt? Oder muss ich dem DataReceivedHandler immer wieder einen Anstoß geben?

Hier mein Code:

SerialPort serialPort1 = new SerialPort();
        public bool SerialPortOpen(string ComPort, string Baudrate, out string DeviceInfo)
       {
           try
           {
               serialPort1.PortName = ComPort;
               serialPort1.BaudRate = Convert.ToInt32(Baudrate);
               serialPort1.Parity = Parity.None;
               serialPort1.DataBits = 8;
               serialPort1.StopBits = StopBits.One;
               serialPort1.Handshake = Handshake.None;
               serialPort1.WriteTimeout = 200;
               serialPort1.ReadTimeout = 200;
               serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
               serialPort1.Open();
               serialPort1.DiscardInBuffer();
               serialPort1.DiscardOutBuffer();
               
               if (serialPort1.IsOpen)
               {
                   isOpen = true;
}}}
        private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
       {
           try
           {
               int intBuffer;
               intBuffer = serialPort1.BytesToRead;
               byte[] byteBuffer = new byte[intBuffer];
               serialPort1.Read(byteBuffer, 0, intBuffer);
               recievedBytes.Add(byteBuffer);               
           }
           catch
           {
           }
       }
Erstellt vor einem Jahr

Das Funktioniert. Vielen Dank!

Für alle die das selbe Problem haben:

[In, Out, MarshalAs(UnmanagedType.LPArray)] byte[] pointerLpbConfig,
Erstellt vor einem Jahr

So habe ich meine Funktion definiert (ist aber bei dem PointerLpBConfig wohl nicht ganz richtig):

[DllImport("CP210xManufacturing.dll", EntryPoint = "CP210x_GetConfig")]
public static extern int getConfig1(
[In, Out] IntPtr deviceHandle,
[In, Out] byte[] pointerLpbConfig,
[In, Out] uint bLength);

Und laut definition soll es so aussehen:

CP210x_GetConfig(HANDLE cyHandle, uint8_t *lpbConfig, uint16_t bLength)
Ich habe das auch mal mit dem Übergabeparameter:
[In, Out] ref Int64 pointerLpbConfig,

versucht, aber da bekomme ich nur einen Pointer Wert "302365680927398" zurück, der sehr sehr groß ist.

Erstellt vor einem Jahr

Hallo,

ich habe ein Problem mit einem Pointer auf ein byte Array in C#.

Ich habe eine Funktion in einer externen DLL die einen Pointer zu einem Byte Array ausgibt.  "lpbConfig—A pointer to a byte array to hold the configuration".

Leider weiß ich damit nicht umzugehen.

In anderen Funktionen wurde auf einen Pointer zu einem Buffer der einen Produkt String zurückgibt "lpProduct—Pointer to a buffer returning the Product String value." mit einem StringBuilder gearbeitet. Ich habe aber bisher noch keine Alternative als Byte Array gefunden die funktioniert.