Ich verwende CreateProcess, um einen cmd.exe-Prozess zu erstellen, dem ein Parameter übergeben wird, der ausgeführt und beendet wird. Dadurch wird die Eingabeaufforderung auf dem Bildschirm angezeigt.
Ich habe versucht, dies zu vermeiden, indem ich STARTUPINFO struct wShowWindow auf SW_HIDE gesetzt habe, aber dieser Parameter scheint das aufrufende Fenster zu beeinflussen, nicht das Fenster für den Prozess, der ausgeführt wird.
Gibt es überhaupt, dass Sie createprocess verwenden können, um ein Programm zu starten, das nicht sichtbar ist?
Was ist auch der richtige Winapi-Standardweg, um Umgebungsvariablen zu erhalten?
Wenn es sich nur um eine Konsolen-App handelt, können Sie auch die verwenden CREATE_NO_WINDOW
Flagge als Teil der CreateProcess
sich nennen, z
CreateProcess(NULL, lpszCommandLine, NULL, NULL, FALSE,
CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
Siehe auch diese Seite für Informationen über Umgebungsvariablen.
Der folgende Link hier beschreibt, wie das Fenster im Hintergrund erstellt wird:
DWORD RunSilent(char* strFunct, char* strstrParams)
{
STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcessInfo;
char Args[4096];
char *pEnvCMD = NULL;
char *pDefaultCMD = "CMD.EXE";
ULONG rc;
memset(&StartupInfo, 0, sizeof(StartupInfo));
StartupInfo.cb = sizeof(STARTUPINFO);
StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow = SW_HIDE;
Args[0] = 0;
pEnvCMD = getenv("COMSPEC");
if(pEnvCMD){
strcpy(Args, pEnvCMD);
}
else{
strcpy(Args, pDefaultCMD);
}
// "/c" option - Do the command then terminate the command window
strcat(Args, " /c ");
//the application you would like to run from the command window
strcat(Args, strFunct);
strcat(Args, " ");
//the parameters passed to the application being run from the command window.
strcat(Args, strstrParams);
if (!CreateProcess( NULL, Args, NULL, NULL, FALSE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&StartupInfo,
&ProcessInfo))
{
return GetLastError();
}
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
if(!GetExitCodeProcess(ProcessInfo.hProcess, &rc))
rc = 0;
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
return rc;
}
Ich denke, getenv und setenv sind alle in Ordnung? Ich bin mir nicht sicher, wonach Sie in dieser Hinsicht fragen.
Setzen Sie das STARTF_USESHOWWINDOW in dwFlags
von Spitzzahn
Dies ist möglicherweise ein Overkill für Ihre Anforderungen, aber Sie können die ShowWindow-API einbinden und niemals Fenster für diesen Prozess anzeigen
14010700cookie-checkwinapi: CreateProcess, aber das Fenster des Prozesses ausblenden?yes
Hast du das STARTF_USESHOWWINDOW in dwFlags gesetzt?
– scharfer Zahn
23. April 2009 um 6:15 Uhr