System geht ShellExecute nicht
-
Hallo ich möchte ein Programm schreiben, dass den Standardgateway ermitteln soll, und dann entsprechend Netzlaufwerke verbinden. Ich habe nun versucht den Standardgateway mittels ipconfig zu ermitteln und in ein File zu schreiben. Das Prolbem ist nun, folgende Methode funktioniert:
system("ipconfig /all > test.txt");dies hingegen nicht
ShellExecute(NULL,"open","ipconfig","/all > text.txt",ExtractFilePath(Application->ExeName).c_str(),SW_NORMAL);Wie krieg ich dass mit ShellExecute hin, damit die ausgabe in das Textfile erfolgt? Oder hat jemand noch ne viel einfachere Möglichkeit den Standardgateway zu ermitteln?
-
siehe FAQ
-
Tipp:
Programm: cmd
Parameter: /k ipconfig /all > text.txt
-
wenn ich cmd als Programm benutze, funktionierts. liegt es daran, dass meine erste Variante mit ShellExectue nicht funktioniert hat, da "> test.txt" ein Parameter von cmd ist und nicht von ipconfig? Weil wenn ich bloss
ShellExecute(0,"open","ipconfig","/all",0,SW_HIDE)aufrufe, ohne das Textfile funktioniert es ja auch.
Wie kann ich jetzt den cmd Prozess wieder beenden?
-
Hallo
du bekommst von ShellExecute den Prozeßhandle als Rückgabewert.
Den kannst du mit TerminateProcess() benutzen, um den prozeß wieer zu beenden./Edit : Und natürlich solltest du den Rückgabewert von ShellExecute erstmal auf einen Fehlercode überprüfen. Siehe MSDN.
Außerdem sollte dir mittlerweile auffallen, das das in das WinAPI-Forum gehört.bis bald
akari
-
Ups, ja hast recht, habe mich im Forum vertan, vielleicht kann ja ein mod diesen Thread verschieben.
Ok, habe mal folgendes probiert, kalpt leider nicht:
int TForm1::ReadIpconfig(AnsiString txtFile,TStringList* IpconfigInfo) { unsigned long ExitCode; HINSTANCE CmdHandle; AnsiString CmdLine = "/k ipconfig /all > "+txtFile; AnsiString Directory = ExtractFilePath(Application->ExeName); CmdHandle = ShellExecute(NULL,"open","cmd", CmdLine.c_str(), Directory.c_str(), SW_NORMAL); if((int)CmdHandle < 32) { MessageBox(NULL,SysErrorMessage(GetLastError()).c_str(), "Error",MB_OK|MB_ICONERROR); return 0; } else; do { GetExitCodeProcess(CmdHandle,&ExitCode); } while(ExitCode == STILL_ACTIVE); if(!TerminateProcess(CmdHandle,ExitCode)) { :arrow_right: MessageBox(NULL,SysErrorMessage(GetLastError()).c_str(), "Error",MB_OK|MB_ICONERROR); return 0; } else; IpconfigInfo->LoadFromFile("test.txt"); return 1; }kriege bei der mit "
" markierten Stelle den Fehler Code Ungültiges Handle zurück
-
Hallo
hm... also laut MSDN sollte es gehen
If the function succeeds, the return value is the instance handle of the application that was run, or the handle of a dynamic data exchange (DDE) server application.
Aber du kannst ja auch ShellExecuteEx nehmen. Dort bekommst du auf jedenfall einen gültigen Handle.
bis bald
akari
-
Habe mal folgende Zeilen versucht, jetzt erhalte ich die Fehlermeldung Zugriff verweigert
unsigned long ExitCode; HINSTANCE CmdHandle; AnsiString CmdLine = "/k ipconfig /all > "+ExtractFileName(txtFile); SHELLEXECUTEINFO ShellInfo; ShellInfo.fMask = SEE_MASK_NOCLOSEPROCESS; ShellInfo.lpVerb = "open"; ShellInfo.lpFile = "cmd"; ShellInfo.lpParameters = CmdLine.c_str(); ShellInfo.lpDirectory = ExtractFilePath(txtFile).c_str(); ShellInfo.nShow = SW_HIDE; if(!ShellExecuteEx(&ShellInfo)) { MessageBox(Application->Handle,SysErrorMessage(GetLastError()).c_str(), "Error",MB_OK|MB_ICONERROR); return 0; } else;