Funktion 'öffnen mit...'

Liebe Leute

Mit system(„Dateiname“); oder mit ShellExecute kann ich eine Datei mit dem als Standart definierten Programm öffnen.
Wie heisst die Funktion, mit der ich eine Datei mit einem bestimmten Programm öffnen kann, und wie funktioniert sie?

Liebe Grüsse
Kalsan

Hallo

Mit system(„Dateiname“); oder mit ShellExecute kann ich eine
Datei mit dem als Standart definierten Programm öffnen.
Wie heisst die Funktion, mit der ich eine Datei mit einem
bestimmten Programm öffnen kann, und wie funktioniert sie?

mit

 system("Programmname Dateiname");

Grüße

CMБ

Haha, genial einfach und einfach genial!
Herzlichen Dank!!! *

Gibt es vielleicht auch eine Funktion, die das betreffende Programm nicht pausiert? System lässt das Programm ja erst wieder laufen, nachdem das andere Fenster geschlossen wurde.
Ich suche noch etwas wie bei ShellExecute, aber mit spezifischem Programm.

Liebe Grüsse
Kalsan

Wie wärs mit ‚CreateProcess()‘ ?
z.B. (ungetestet):

STARTUPINFO xStartupInf;
PROCESS\_INFORMATION xProcessInf; 
char sApplication[] = "Programmname";
char sCommandLine[] = "Dateiname";
char sWorkingDir[] = NULL;
int iRet;

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( 
 sApplication, // 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);
}

mfg
Christof

Hallo Christof

Herzlichen Dank für deine Antwort. Durch Probieren habe ich herausgefunden, dass sich die nötigen Header etc. in befinden. Totzdem spuckt mein Compiler (der von Dev-C++) „invalid initializer“ aus. Hier ist der genaue Compiler-Log:

Compiler: Default compiler
Building Makefile: "C:\Users\sandro.kalbermatter\Documents\Programmierung\C(++)\Mathe\_mit\_Spass\_b-2-1\Makefile.win"
Führt make... aus
make.exe -f "C:\Users\sandro.kalbermatter\Documents\Programmierung\C(++)\Mathe\_mit\_Spass\_b-2-1\Makefile.win" all
g++.exe -c main\_LADER.cpp -o main\_LADER.o -I"C:/Programme/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Programme/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Programme/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Programme/Dev-Cpp/include/c++/3.4.2" -I"C:/Programme/Dev-Cpp/include" 

main\_LADER.cpp: In function `int main(int, char\*\*)':
main\_LADER.cpp:39: error: initializer fails to determine size of `sCommandLine'
main\_LADER.cpp:39: error: invalid initializer
main\_LADER.cpp:40: error: initializer fails to determine size of `sWorkingDir'
main\_LADER.cpp:40: error: invalid initializer

make.exe: \*\*\* [main\_LADER.o] Error 1

Ausführung beendet

So sieht mein Quelltext aus:

STARTUPINFO xStartupInf;
 PROCESS\_INFORMATION xProcessInf; 
 char sApplication[] = "notepad.exe";
 char sCommandLine[] = argv[1];
 char sWorkingDir[] = NULL;
 int iRet;

 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( 
 sApplication, // 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);
 }

Liebe Grüsse
Kalsan

Hallo Kalsan !

char sCommandLine[] = argv[1];
main_LADER.cpp:39: error: initializer fails to determine size
of `sCommandLine’

Ist klar: die Grösse von argv[1] ist zur Compilezeit nicht bekannt. Da das aber sowieso schon ein existierende String ist brauchst du den eh nicht zu kopieren sondern nur darauf zeigen (aber Achtung: nicht versuchen ihn zu ändern bzw. nur wenn du weiss was du da tust weil der in einem anderen Speicherbereich (Environment) liegt):

char \*sCommandLine = argv[1];

char sWorkingDir[] = NULL;
main_LADER.cpp:40: error: initializer fails to determine size
of `sWorkingDir’

Mein Fehler, char[] kann man natürlich nicht mit NULL initialisieren, daher:

char \*sWorkingDir = NULL;

Oder ganz weglassen und im Funktionsanruf gleich NULL statt sWorkingDir als Parameter reinschreiben.

mfg
Christof

Hallo Christof

Der Compiler lässt jetzt alles funktionieren. Allerdings meldet das Programm: „Fehler!“
Leider ist das, was du mir gesendet hast, für mich nur Fachchinesisch, da ich nur Hobbyprogrammierer bin. Hier ist mein Quellcode:

STARTUPINFO xStartupInf;
 PROCESS\_INFORMATION xProcessInf; 
 char sApplication[] = "notepad.exe";
 char \*sCommandLine = argv[1];
 char \*sWorkingDir = NULL;
 int iRet;

 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( 
 sApplication, // 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) 
 {
 cout

Liebe Grüsse
Kalsan

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

1 Like

Ha!!!
Es funktioniert!
Du bist genial!

Herzlichen Dank für deine so geduldige Hilfe!

Liebe Grüsse
Kalsan

*

Funktioniert doch nicht :frowning:
Mist.

Funktioniert doch nicht. Es wird ein leeres Editorfenster geöffnet…

-(

Hallo Kalsan !

Wird denn die zu editierende Datei gefunden ?
Hier gilt ebenso: notepad sucht die zu öffnende Datei (die als Parameter angegeben ist) wenn kein kompletter Pfad angegeben ist nur im aktuellen Arbeitsverzeichnis (=WorkingDir). Du musst also gegebenenfalls den Parameter ‚sWorkingDir‘ auf den richtigen Pfad setzen !

mfg
Christof

Hm, ich verstehe nicht ganz… Muss ich denn der Ordner, in dem sich die Datei befindet, unter WorkingDir angeben?

Dies habe ich gemacht, aber es öffnet sich noch immer ein leeres Fenster. Hier ist mein Quellcode.

stammpfad enthält den Ordner des Programms und ist vom Typ string. Die Zieldatei befindet sich einen Ordner weiter unten (Wenn der Ordner des Programms „Ordner“ heisst, ist die Zieldatei in „Ordner/listen“.

 dtp=stammpfad;
 dtp+="listen";
 char text2[500];
 strcpy(text2,dtp.c\_str());
 cout


Liebe Grüsse
Kalsan

Hallo Kalsan !

Das hat mich jetzt auch verwundert und habe mir das genauer angesehen:
Offenbar übergibt ‚CreateProcess()‘ die Kommandozeile (also den Parameter ‚sCommandLine‘) 1:1 an die aufgerufene Anwendung ohne die Anwendung selbst als 1. Parameter davor einzufügen (wie ich es eigentlich erwartet habe), du musst den Programmnamen also selbst als ersten Parameter in ‚sCommandLine‘ einfügen damit die zu öffnende Datei der von Notepad erwartete 2. Parameter wird. (Der 1. Parameter kann hier dann auch ein Dummy sein, z.b. „xxx“).
Vorsicht: Wenn Leerzeichen in einem der Parameter für CommandLine vorkommen muss man den entsprechenden Parameter mit Anführungszeichen einrahmen !
Ich würde also folgenden Code wieder einfügen:

.
.
.
int iRet;
int iSize = 0;

iSize = strlen(sApplication) + 2; // Platz für Programmname + 2 Anführungszeichen
if (argv[1] != NULL)
{
 ++iSize; // Platz für 1 Leerzeichen nach Programmname
 iSize += strlen(argv[1]) + 2; // Platz für argv[1] + 2 Anführungszeichen
}
++iSize; // Platz für abschliessendes '\0'
sCommandLine = (char\*)malloc(iSize);
if (sCommandLine == NULL)
{
 cout

Das WorkingDir musst du natürlich trotzdem setzen, das kann Notepad ja sonst weiterhin nicht wissen.
Ob du dann in CreateProcess() den Parameter 'lpApplicationName' (1. Parameter) als NULL oder 'sApplication' angibst sollte egal sein (ich würde ihn aber auf NULL setzen).

mfg
Christof
1 Like

Jetzt geht’s :smile:
Aah, endlich!
Herzlichen Dank!!!

*

Liebe Grüsse
Kalsan