Avatar billede swaxi Nybegynder
15. februar 2005 - 16:09 Der er 7 kommentarer og
1 løsning

Brug af klassen Process i .NET

Jeg prøver at skrive et program, der starter et andet program vha. cli, men er rendt ind i et problem. Koden til at starte processen ser således ud :
<code>
Process^ myProcess = gcnew Process;
String^ tempFile = IO::Path::GetTempFileName();
String^ sArgs = String::Concat("-x\"", tempFile, "\" -p2000 -c3");
try {
  myProcess->StartInfo->FileName = sBinFilename;
  myProcess->StartInfo->Arguments = sArgs;
  myProcess->StartInfo->CreateNoWindow = true;
  myProcess->StartInfo->UseShellExecute = false;
  myProcess->StartInfo->RedirectStandardOutput = true;
  myProcess->Start();

  myProcess->StandardOutput->ReadToEnd();
  myProcess->WaitForExit();
} catch ( Win32Exception^ e )  {
  Console::WriteLine("The process failed:\n{0}", e->ToString());
  return -1;
}
</code>

Problemet er, at det program jeg kalder både kan køre i windowed mode og i CLI mode. Hvis jeg kalder det fra en kommandoprompt, så skriver det data til en fil, og åbner ikke nogen gui. Men det er desværre ikke resultatet af ovenstående kode - Når jeg køre den, åbner programmet i windowed mode - altså somom man havde dobbeltklikket på programmet.

Er der en switch/property man kan sætte på StartInfo som får den til at kalde programmet somom det blev kørt fra cli ? Eller skal jeg ud i noget helt andet ?

Jeg er ikke glad for at skulle lave en BAT fil (som er den eneste workaround jeg lige kan se)
Avatar billede arne_v Ekspert
15. februar 2005 - 16:12 #1
Prøv at køre:

cmd /c program argumenter

fremfor

program argumenter
Avatar billede jpk Nybegynder
15. februar 2005 - 16:19 #2
Du kan evt. bruge følgende hvis du ikke vil vise vinduet:

myProcess->StartInfo->WindowStyle = ProcessWindowStyle::Hidden;
Avatar billede jpk Nybegynder
15. februar 2005 - 16:20 #3
Men det er ikke sikkert det er det du er ude efter...
Avatar billede swaxi Nybegynder
15. februar 2005 - 17:12 #4
lidt pinligt, men det lykkedes mig at finde frem til problemet. den binære fil jeg kalder, får et filnavn som argument. af en eller anden grund kan den ikke klare at få et langt filnavn, hvorfor den kløjs i det på IO::Path::GetTempFileName(); og defaulter til at åbne i windowed mode.

tak for forslagene anyways.

ved nogen af jer hvordan man kan konvertere et long filename (med væmmelige mellemrum) til et short filename (ala dos) ?
Avatar billede swaxi Nybegynder
15. februar 2005 - 17:40 #5
jeg er vist ude efter .NET ekvivalenten til GetShortPathName
Avatar billede arne_v Ekspert
15. februar 2005 - 18:31 #6
[DllImport("Kernel32", CharSet = CharSet.Auto)]
static extern Int32 GetShortPathName(
  String path,                // input string
  StringBuilder shortPath,    // output string
  Int32 shortPathLength);    // StringBuilder.Capacity
Avatar billede swaxi Nybegynder
17. februar 2005 - 12:12 #7
jatak ... det virker sørme ... for det tilfælde at andre måtte have brug for det samme, ser den fulde deklaration såddan her ud i managed c++
[code]
#using <mscorlib.dll>
using namespace System::Runtime::InteropServices;
namespace SysWin32 {
    [DllImport("Kernel32", CharSet = CharSet::Auto)]
    Int32 GetShortPathName(
        String^ path,                // input string
        StringBuilder^ shortPath,    // output string
        Int32^ shortPathLength);    // StringBuilder.Capacity
}
[/code]

smider du lige et svar arne.
Avatar billede arne_v Ekspert
17. februar 2005 - 12:22 #8
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester