Autor Beitrag
Luna1987
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

WinXP

BeitragVerfasst: Di 03.03.09 15:14 
Hy @ all.
Seid knapp einer Woche beschäftige ich mich aufgrund eines Praktikums mit C# und Visual Studio 2008.
Schon eine Ewigkeit suche ich nach einer Lösung für mein Problem, leider erfloglos. Ich hoffe ihr könnte mir helfen?!?

Ich kann mir bei meiner Anwendung (Windows Form Application) eine Datei (*.cs) auswählen. Diese ausgewählte Datei soll nun auf ein externes Tool angewandt werden. Es gibt da z.B. das Tool "SystemMonitor", das einem die Lines of Code u.a. der ausgewählten Datei ausgibt. Wie übergebe ich nun diese Datei an das Tool? Ich möchte nicht, dass das Tool einfach nur über Process.Start(); gestartet wird und dann vom Nutzer normal genutzt wird, sondern eben mein Dateipfad übergeben an dieses Tool und er soll mir dann in einer Text Box (oder ähnliches) das Ergebnis ausgeben. Dazu muss ich ja vorher auch bestimmte Standardeinstellungen verlangen (die das Tool eben auch verlangt) und diese übergeben. Benötigt man dafür eine selbstgeschriebene dll oder wie mache ich das?

Ich hoffe ihr könnt mir helfen?!??
Achso, das ganze wird intern genutzt, also nicht dass ihr denkt ich will ein bereits vorhandenes Tool „klauen“ und es hinterher mit einer anderen Oberfläche veröffentlichen oder so ;-) Sollen zusätzlich noch andere Analysetools miteinbezogen werden, aber mir würde eine allgemeine Hilfestellung sicherlich erstmal reichen.
Danke im Vorraus!
Glg.


Moderiert von user profile iconKha: Topic aus WinForms verschoben am Mi 04.03.2009 um 13:18
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Di 03.03.09 15:28 
Hallo,

das Ganze funktioniert nur, wenn das "Zielprogramm" übergebene Parameter auch automatisch auswerten kann. Wenn das der Fall ist, dann geht es mit Process.Start. Beachte dazu: Unter NET gibt es bei vielen Methoden Überladungen mit anderen Argumenten; ein Parameter darf nicht (wie sonst üblich) im selben String wie der Name der Anwendung übergeben werden, sondern getrennt als Befehlszeilenargument. Einzelheiten sind (wie immer) in der SDK-Doku/MSDN nachzulesen.

Gruß Jürgen

Hast Du ein Glück, dass ich zuerst hier geantwortet habe. Unter Wie poste ich richtig? steht, dass in dem anderen Forum keine Doppel-Posts erlaubt sind.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 03.03.09 15:49 
Hallo und :welcome: im Forum!

Ein kleines Beispiel sieht z.B. so aus:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
Process pingProcess = new Process();
// Befehl
pingProcess.StartInfo.FileName = "ping";
// Die Ausgaben, Fehler wie normale Ausgabe, umleiten
pingProcess.StartInfo.RedirectStandardOutput = true;
pingProcess.StartInfo.RedirectStandardError = true;
// Die angegebene IP als Argument angeben
pingProcess.StartInfo.Arguments = txtIP.Text;
// Nicht ShellExecute benutzen, sondern selbst starten
pingProcess.StartInfo.UseShellExecute = false;
// Starten
pingProcess.Start();
// Bis zu 6 Sekunden aufs Beenden warten
pingProcess.WaitForExit(6000);
// ExitCode auswerten, 0 heißt alles in Ordnung
if (pingProcess.ExitCode == 0)
    txtOutput.Text = pingProcess.StandardOutput.ReadToEnd();
else
    txtOutput.Text = "Ein Fehler ist aufgetreten!";
Mehr dazu wie schon gesagt wurde in der Dokumentation, hier die zu UseShellExecute mit einem kleinen Beispiel:
msdn.microsoft.com/d...useshellexecute.aspx
Luna1987 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

WinXP

BeitragVerfasst: Mi 04.03.09 12:53 
Hallo Jürgen und Sebastian.
Danke für eure schnelle Antwort :)

Habe rausgefunden, dass man dieses externe Tool über die cmd mit einer Batch (XML) Datei starten kann. Habe also eine XML Datei erstellt. Wenn ich das Kommando nun per Hand in der cmd starte, funktioniert das auch super wie es sein soll, d.h. anhand des Kommandos wird das Tool SourceMonitor gestartet und die Daten der XML Datei übergeben und somit alles automatisch erzeugt.
(Kommando: D:\Programme\SourceMonitor\SourceMonitor.exe /C "D:\… \Commands.xml") Weiter passiert nix. Mit einem weiteren Befehl (D:\Programme\SourceMonitor\SourceMonitor.exe test.smp), der danach ausgeführt wird, wird nun mit der automatisch, neu erzeugten smp – Datei (benötigt man für den SourceMonitor) der SourceMonitor geöffnet und das Ergebnis angezeigt!

In meinem Programm geht’s aber nicht :cry: Ich übergebe das Kommando als Argument und dann öffnet er mir einfach immer NUR die XML Datei im Browser, obwohl ja bei der ersten Übergabe gar nix (sichtbares) passieren sollte). Diese XML Datei sollte er eigentlich auf das Tool anwenden, um eben automatisch alles zu erzeugen!! Was habe ich falsch gemacht :?:

Hier noch ein Teil des Programmcodes:

Process process = new Process();
process.StartInfo.CreateNoWindow = true;
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments = result;
process.Start();


Ich hoffe ihr versteht mein Problem und könnt mir helfen??!
Glg und danke.
Anne.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 04.03.09 13:16 
Hallo Anne,

FileName darf nicht cmd.exe sein, sondern es muss entweder Deine Batchdatei oder SourceMonitor.exe sein. Das Argument "/C" muss Bestandteil von Arguments (d.h. von result) sein. Und was glaubst Du wohl, was durch CreateNoWindow gesteuert wird?

Für die Anzeige von Programmcode gibt es unter "Bereiche" das C# mit dem Plus-Button.

Gruß Jürgen
Luna1987 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

WinXP

BeitragVerfasst: Mi 04.03.09 13:51 
Hallo Jürgen.

Jetzt bin ich verwirrt... :shock:
Ich will doch aber die cmd.exe ZUERST ausführen und da soll dann das Kommando "D:\Programme\SourceMonitor\SourceMonitor.exe /C "D:\… \Commands.xml" automatisch ausgeführt werden. Wenn ich zuerst SourceMonitor.exe starte, dann kann ich dieses Kommando doch net ausführen, dann startet ja sofort das normale Programm mit seiner typischen Oberfläche etc, wo der Nutzer selbst aktiv werden muss und was eintragen muss, das soll ja eben nicht so sein.
Wie realisiert ich das? Oder hab ich dich total falsch verstanden?

Dieses CreateNoWindow wird wohl dafür sein, dass kein extra Fenster für die ganze Aktion geöffnet wird, was ich ja auch so haben will! Oder?

Danke :D
Anne
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 04.03.09 14:14 
Cmd ist nur Mittel zum Zweck, das brauchst du in deinem Code nicht. Die "normale Oberfläche" wird nicht etwas dadurch verborgen, dass du das Programm in der Cmd startest, sondern eben durch Übergabe des Parameters. Jürgen hat also vollkommen Recht: StartInfo.FileName muss deine SourceMoniter-Exe sein.
Anders gesagt: Cmd macht selbst nichts anderes als was du mit Process.Start machst. Das eine im anderen verschachtelt wäre doppelt gemoppelt.

_________________
>λ=
Luna1987 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

WinXP

BeitragVerfasst: Mi 04.03.09 14:40 
:!: Ahhhhh!
Jetzt habe ich es verstanden. Habe es geändert und es funktioniert nun wunderbar, so wie ich es haben wollte.
Danke euch :D
Bis zm nächsten Problem dann ;)
Glg.