# externes Programm über C++ Code starten



## brixx (29. Juni 2004)

Hallo zusammen,

womöglich wurde diese Frage schon einmal gestellt, aber die Suchfunktion findet eine Frage derart nicht, deshalb stell ich sie lieber trotzdem mal.

Ich arbeite mit dem Borland C++ Builder 5 und schreibe derzeit eine Programmauswahl. Das Programm ist modularisiert und ich möchte in den Funktionen sagen das ich eine Datei bzw. ein Programm starten möchte.

Ich habe ein Switch-Konstrukt benutzt. Sieht derzeit ungefähr so aus:

*
. // Oberer Programmteil + Auswahlmenü usw.
.
.

switch(iAuswahl){

                 case 1:
                      Funktion1(bla bla);
                      break;

                 case 2:
                      Funktion2(bla bla);
                      break;

                 case 3:
                      Funktion3(bla bla);
                      break;

                 case 4:
                      Funktion4(bla bla);
                      break;


                 }

.
.
.

//Modulteil für Funktionen

Funktion1(bla bla){

// Aufruf des Programms

};*

und in dieser Funktion möchte ich zum Beispiel einen Treiber starten, der sich installiert.
Ich weis nur leider nicht wie, vielleicht kann mir jemand helfen.

Gruß
die kleine brixx


----------



## Radhad (29. Juni 2004)

Dazu müsstest du den system-Befehl verwenden, wenn du eine Konsolenanwendung benutzt. Da müsstest du dann den festen Pfad angeben.


----------



## brixx (29. Juni 2004)

Ja das sieht derzeit so aus

das ist jetzt mal ein test den ich derzeit versuche:

*ShellExecute("C:\\Dokumente und Einstellungen\\Name\\Desktop\\text.txt");*

Da kommt aber die Meldung das er ShellExecute nicht kennt.
Nachdem einbinden der Headerdatei für ShellExecute kommt noch ein Fehler in der Headerdatei, irgendwas stimmt nicht.


----------



## MC Breit (29. Juni 2004)

```
char *selected;

switch(iAuswahl)
{
 case 1:
   selected="blubb.exe";
 break; 

 case 2:
   selected="bla.txt";
 break; 

 case 3:
   selected="lol.pdf";
 break;

 case 4:
  selected="lala.com";
 break;
}
ShellExecute(NULL, NULL, selected, NULL, NULL, SW_SHOW);
```

schonmal so versucht?


----------



## brixx (29. Juni 2004)

[C++ Fehler] driver.cpp(43): E2268 Aufruf der undefinierten Funktion 'ShellExecute'
[C++ Fehler] driver.cpp(43): E2451 Undefiniertes Symbol 'SW_SHOW'

Das kommt dabei leider raus.
wenn ich dann die shellapi.h einbinde kommen Fehler von der Headerdatei.


----------



## frager (29. Juni 2004)

Binde windows.h statt shellapi.h ein


----------



## Icefire123 (19. April 2010)

Ich arbeite mit Visual Studio und habe eine MFC Anwendung. Kann ich in mein Programm ein externes Programm (.exe) einbinden und dieses starten lassen? 
So das ich am Ende ein ausführbares Programm habe, dieses starte und in dem Programm auf einen Button klicke und dann die eingebundene Applikation startet.

Ist das möglich? kann mir jemand erklären wie das funktioniert?


----------



## CrC (13. Oktober 2010)

ShellExecute sollte man in der regel nicht verwenden.

versuch das ganze mal mit system() um einfach ein programm auszuführen.

wenn du von der konsole auch noch eine rückmeldung brauchst, oder mit dem arbeiten möchtest was dort ausgegeben wird würde ich popen() empfehlen, wobei es auch da mit sicherheit noch bessere möglichkeiten gibt.

@ice
generell ist fast alles möglich, aber der weg zu dem was du möchtest ist glaub ich ein anderer wie du dir vorstellst. du müsstest dir quasi einfach ein programm bauen was an den bestimmten prozess die passende windows message schickt das der knopf gedrückt wurde. dazu schaust du dir am besten mal an wie windows genau arbeitet und schon wird dir ziemlich schnell bewusst das das ganze mit minimalem aufwand hin zu bekommen ist. um heraus zu finden welche messages laufen kann ich übrigens das tool spy was beim visual studio von ms dabei ist nur empfehlen.

mfg CrC


----------



## Crash Kid (13. Oktober 2010)

@Icefire:

Hey,

ich habe vor ein paar Wochen das selbe gesucht wie du und bin dabei auf folgendes Ergebnis gekommen:

1. Du fügst das Programm als Resource hinzu:

Resource.h:

```
#define ID_PROGRAM 1
#define EXE 300
```

Resource.rc:

```
#include Resource.h

ID_PROGRAME EXE "Testprogram.exe"
```

2. Du suchst im 1. Programm nach dem angehängtem Programm mit FindResouce usw.
3. Speicherst sie dann ab und startest sie

Das man das Programm direkt starten kann hab ich nicht gefunden. In verschiedenen Foren schreiben alle das es nicht geht. Hab auch nichts gefunden und selbst viel ausprobiert, aber ohne Erfolg...
Falls du eine Lösung findest, bitte hier posten. Ich bräuchte sie dann auch...


```
#include <windows.h>

using namespace std;

string stProgrampfad = "Testprogramm2.exe";
int iDateigroesse;
int iProgram_gestartet;
fstream fDatei;
HRSRC hrsrcResource;
HGLOBAL hglobalResource;

int main()
{
hrsrcResource = FindResource(NULL, MAKEINTRESOURCE(ID_PROGRAM), MAKEINTRESOURCE(EXE));

if(hrsrcResource != NULL)
{
    hglobalResource = LoadResource(NULL, hrsrcResource);
    iDateigroesse = SizeofResource(NULL, hrsrcResource);
    
    fDatei.open(stProgrammpfad.c_str(), ios::out | ios::binary | ios::trunc);
    fDatei.write((char*)hglobalResource, iDateigroesse);
    fDatei.close();
}

iProgramm_gestartet = WinExec(stProgrammpfad.c_str(), SW_SHOW);

if(iProgramm_gestartet > 31)
{
    //Konnte gestartet werden
}
else
{
    //Konnte nicht gestartet werden
}
}
```

gruß


----------



## MCoder (13. Oktober 2010)

CrC hat gesagt.:


> ShellExecute sollte man in der regel nicht verwenden.


Warum nicht?


----------



## Endurion (14. Oktober 2010)

<sarkasmus>Weil die MFC-Anwendung dann nicht mehr portabel ist</sarkasmus>


----------



## MCoder (14. Oktober 2010)

Das ist einleuchtend


----------

