15. februar 2005 - 16:09Der 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)
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) ?
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]
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.