Hallo Kalsan !
Das es nicht funktioniert liegt daran, dass die Funtion CreateProcess() als lpApplicationName (1. Parameter) den kompletten Pfad zum zu startenden Programm erwartet. Es wertet nicht die Einträge im ‚PATH‘-Environment - String aus. Du musst also den kompletten Pfad in ApplicationName angeben:
char sApplication[] = "C:\\Windows\\notepad.exe";
Wenn du ein Systemprogramm starten willst oder ein anderes Programm dessen Ort sicher in der ‚PATH‘-Environmentvariable gespeichert ist und du keinen festen Pfad angeben willst kannst du die Auswertung der ‚PATH‘-Einträge erzwingen indem du das Programm nicht im ApplicationName-Parameter angibst sondern im CommandLine-Parameter und den ApplicationName-Parameter dafür NULL setzt. Dann wird die CommandLine an die Shell weitergereicht und die ganze Zeile so behandelt als wenn du sie von einem Eingabeaufforderungsfenster aus eingibst.
Du musst dann aber die Commandline zusammensetzen.
Das ganze könnten dann etwa so aussehen:
STARTUPINFO xStartupInf;
PROCESS\_INFORMATION xProcessInf;
char sApplication[] = "notepad.exe";
char \*sCommandLine = NULL;
char \*sWorkingDir = NULL;
int iSize = 0;
int iRet;
iSize = strlen(sApplication); // Platz für Programmname
if (argv[1] != NULL)
{
++iSize; // Platz für 1 Leerzeichen nach Programmname
iSize += strlen(argv[1]); // Platz für argv[1]
}
++iSize; // Platz für abschliessendes '\0'
sCommandLine = (char\*)malloc(iSize);
if (sCommandLine == NULL)
fputs("Fehler!", stderr);
strcpy(sCommandLine, sApplication);
if (argv[1] != NULL)
{
strcat(sCommandLine, " ");
strcat(sCommandLine, argv[1]);
}
xStartupInf.cb = sizeof(STARTUPINFO);
xStartupInf.lpReserved = NULL;
xStartupInf.lpDesktop = NULL;
xStartupInf.lpTitle = NULL;
xStartupInf.dwFlags = STARTF\_USESHOWWINDOW;
xStartupInf.cbReserved2 = 0,
xStartupInf.lpReserved2 = NULL;
xStartupInf.wShowWindow = SW\_SHOWNORMAL;
iRet = CreateProcess(
NULL, // LPCTSTR lpApplicationName, // pointer to name of executable module
sCommandLine, // LPTSTR lpCommandLine, // pointer to command line string
NULL, // LPSECURITY\_ATTRIBUTES lpProcessAttributes, // pointer to process security attributes
NULL, // LPSECURITY\_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes
FALSE, // bool bInheritHandles, // handle inheritance flag
0, // DWORD dwCreationFlags, // creation flags
NULL, // LPVOID lpEnvironment, // pointer to new environment block
sWorkingDir, // LPCTSTR lpCurrentDirectory, // pointer to current directory name
&xStartupInf, // LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO
&xProcessInf // LPPROCESS\_INFORMATION lpProcessInformation // pointer to PROCESS\_INFORMATION
);
if (iRet == 0)
{
fputs("Fehler!", stderr);
}
free(sCommandLine);
sCommandLine = NULL;
mfg
Christof