Avatar billede emileej Nybegynder
29. december 2001 - 16:59 Der er 14 kommentarer og
2 løsninger

Eksekvering af et eksternt program

Hvordan kalder jeg et program - med parametre fra mit eget program, og hvordan bestemmer jeg hvor dets output skal havne?

E-)mil
http://eej.dk
Avatar billede cd_ Nybegynder
29. december 2001 - 17:09 #1
Avatar billede kamikaze Nybegynder
30. december 2001 - 12:42 #2
Du kan kalde ShellExecuteEx:

WINSHELLAPI BOOL WINAPI ShellExecuteEx(
    LPSHELLEXECUTEINFO lpExecInfo
);

Dette Win32 API-kald tager et parameter, af type:

typedef struct _SHELLEXECUTEINFO{
    DWORD cbSize;
    ULONG fMask;
    HWND hwnd;
    LPCTSTR lpVerb;
    LPCTSTR lpFile;
    LPCTSTR lpParameters;
    LPCTSTR lpDirectory;
    int nShow;
    HINSTANCE hInstApp;

    // Optional members
    LPVOID lpIDList;
    LPCSTR lpClass;
    HKEY hkeyClass;
    DWORD dwHotKey;
    HANDLE hIcon;
    HANDLE hProcess;
} SHELLEXECUTEINFO, FAR *LPSHELLEXECUTEINFO;

HVORDAN:

Du laver altså først en instans af SHELLEXECUTEINFO:

SHELLEXECUTEINFO si;
//sæt værdier i si
si.cbSize = sizeof(SHELLEXECUTEINFO);
si.hwnd = hwnd; //Handle to owner window
si.lpFile = \"notepad.exe\";
si.lpParameters = \"MyFile.txt\";
// osv.osv...læs dokumentationen.

Så kalder du ShellExecuteEx:

ShellExecuteEx(si);

Hvilken kompiler bruger du??? (jeg har måske noget kode liggende)
Avatar billede emileej Nybegynder
31. december 2002 - 10:38 #3
Jeg bruger Dev-C++, men senere skal koden også kunne compiles i M$ VC++...
Avatar billede kamikaze Nybegynder
31. december 2002 - 11:53 #4
Følgende kompilerer i M$VC++, konsol applikation:

#include <windows.h>
#include <iostream.h>
#include <conio.h>

void RunProgram(char* pszAppName, char* pszParams)
{
    ShellExecute(NULL,
                \"open\",
                pszAppName,
                pszParams,
                NULL,
                SW_SHOW);
}

int main()
{
    cout << \"Press any key to launch notepad...\" << endl;
    getch();
    RunProgram(\"notepad.exe\", NULL);
    cout << \"Press any key to terminate...\" << endl;
    getch();
    return 0;
}

(Bruger ikke ShellExecuteEx men bare ShellExecute)
Avatar billede kamikaze Nybegynder
31. december 2002 - 11:54 #5
Det er så simpelt som jeg lige kan gøre det her nytårsaftens dag... :-)
Avatar billede emileej Nybegynder
31. december 2002 - 12:04 #6
*Hehe* Det ser da helt fint ud. ShellExecute ligger i windows.h - ja/nej? *<:-)

E-)mil
Avatar billede kamikaze Nybegynder
31. december 2002 - 17:02 #7
Ja, det gør den SKÅL!!!!!!!!!!!!!!!! :-)
Avatar billede emileej Nybegynder
01. januar 2002 - 15:28 #8
Er der ikke en måde at få mit program til at pause ind til, det program jeg har kaldt, er afsluttet?
Avatar billede kamikaze Nybegynder
01. januar 2002 - 16:34 #9
Jo, men så vidt jeg husker kan man ikke det med ShellExecute. Så skal du bruger spawnl() fra process.h (skal lige lede lidt...)
Avatar billede emileej Nybegynder
01. januar 2002 - 16:41 #10
Øwkai - jeg venter *gG*
Avatar billede mbulow Nybegynder
01. januar 2002 - 18:33 #11
Du kan, som kamikaze også siger, starte den nye process med _spawnl():

_spawnl(
    _P_WAIT,            //Den her betyder at den kaldende process skal vente til den nye afslutter
    \"C:\\\\Windows\\\\Notepad.exe\",
    \"argument1\",
    \"argument2\",
    \"osv. indtil der ikke er flere argumenter\",
    NULL                //Og så tilføjer vi lige et NULL, for at afslutte argumentlisten
);

Her har du microsoft side med beskrivelsen af spawn-funktionerne (Der er nogen stykker)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/HTML/_crt__spawn.2c_._wspawn_functions.asp

PS!!! Jeg ved godt, jeg egentlig kom med svaret på kamikaze\'s forklaring, men jeg er IKKE pointjager, så giv dem ENDELIG til kamikaze :)
Jeg tænke bare det kunne være der gik et stykke tid før der kom et svar hvis kamikaze skulle sove nytårs brandert af ;) Hehe (Og hvem ved, det kunne være det hastede, med et svar)
Avatar billede kamikaze Nybegynder
02. januar 2002 - 15:53 #12
mbulow >> Tak, tak...Er lige startet på nyt job, så tid har jeg ikke meget af. Det var jo nemlig lige mit svar...
Avatar billede emileej Nybegynder
04. januar 2002 - 13:03 #13
Den kører slet ikke programmet...
Avatar billede soepro Nybegynder
07. januar 2002 - 09:09 #14
Du kan køre et program fra dit eget program vha. ShellExecute (Win32) eller spawnl (DOS + Win32), dog er det kun vha. sidstnævnte at du direkte kan få dit program til at vente på at \"underprogrammet\" kører færdigt.

Følgende to kodestumper er nappet fra fungerende programmer:
#include <dos>
#include <process>
:
{ // Starter notepad og venter på at den bliver færdig.
  int ret;
  char *docName = \"C:\\\\autoexec.bat\";
  ret = spawnl(P_WAIT, \"notepad.exe\", \"notepad.exe\", docName, NULL);
}

#include <shellapi>
:
{
  HINSTANCE    shellExe;

  // Start Internet Explorer/Netscape using Windows associations
  // and notify user about results.
  shellExe = ShellExecute(Application->Handle, \"open\",
                          edtHomeURL->Text.c_str(), NULL, NULL, SW_SHOWNORMAL);
  if ((int)shellExe <= 32L)
    Application->MessageBox(\"Default Internet browser kunne IKKE startes.\",
                            \"Fejl under opstart af Internet-browser\",
                            MB_ICONERROR | MB_OK);
}
Avatar billede soepro Nybegynder
07. januar 2002 - 09:11 #15
Bemærk at spawnl\'s 2. og 3. parameter begge indeholder programmets navn - parameter 2. er path/sti til programmet, parameter 3. det som det pågældende program skal se som parameter 0, dvs. egen opstartsparamtre. De fleste applikationer forventer at de to er ens. (Fordi de anvender parameter 0 til at finde programmets sti.)
Avatar billede emileej Nybegynder
10. februar 2002 - 14:03 #16
Hov! *pineligt*
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester