Köra ett program inne i ett annat program? (c++, windows)

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jan 2008

Köra ett program inne i ett annat program? (c++, windows)

Ok jag har ett program som startar ett annat program (det andra programet körs i windows terminalen) med olika parametrar men nu undrar jag hur man ska gå tillväga för att få programmet att starta programmet inuti "launchern" i stället för att öppna ett nytt terminal fönster

Exempel när man trycker på knappen så startar terminal programmet osynligt plus att en liten röd ring blir grön och när man sedan trycker på knappen igen så blir ringen röd igen och programmet avslutas.
[Knapp] ( )
[Knapp] (*)
[Knapp] ( )

Just nu så startar programmet det andra programmet i ett terminal fönstret med shellexecute funktionen och sedan stänger man av terminal fönstret genom att kryssa ner terminalen. Så vad som ska ändras är att terminal programmet ska startas som jag beskrev ovan plus att när man trycker på knappen igen så istället för att öppna ett till fönster som nu så ska det stänga det andra programmet som körs "osynligt".

Jag är ledsen att jag inte kan ge någon källkod nu men jag är på min laptop och inte hemma just nu så jag har ingen tillgång till min kod.

[i7 2600k @ 5GHz| NH-D14, fläktar utbyta mot ljudlösa 120mm SySS 800| Asus P8P67| HD6870 DirectCU| Corsair 4x8GB (32GB) 1600MHz DDR3| Moddat Corsair 550VX | Mac Pro / G5 Chassi| 2x120GB raid0 Intel 520 sys+ 2x3TB slask & home (riktig lagring på 12TB ZRAID NAS som även home backuppas/rsyncas till) ] - Helt ljudlös om man inte lägger örat intill chassit
[ MacBook Pro Retina 13 | 16GB ram | 256GB PCIe SSD | OS X(main), Arch ]

Trädvy Permalänk
Medlem
Plats
Berget
Registrerad
Jun 2002

Sätt nShowCmd till SW_HIDE.

ShellExecute(NULL, "open", "program.exe", "params", NULL, SW_HIDE);

Mer info om ShellExecute()
http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx

Använd sedan resultatet (HINSTANCE) för att manipulera instansen.

Alt. använd CreateProcess() samt TerminateProcess()

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jan 2008

Okej men hur går jag tillväga för att kolla om programmet körs.
Koden borde ju bli något i stil med

Om program körs
visa grön bild

Annars
visa röd bild

och för knappen

Om program körs
stäng program

Annars
starta program

[i7 2600k @ 5GHz| NH-D14, fläktar utbyta mot ljudlösa 120mm SySS 800| Asus P8P67| HD6870 DirectCU| Corsair 4x8GB (32GB) 1600MHz DDR3| Moddat Corsair 550VX | Mac Pro / G5 Chassi| 2x120GB raid0 Intel 520 sys+ 2x3TB slask & home (riktig lagring på 12TB ZRAID NAS som även home backuppas/rsyncas till) ] - Helt ljudlös om man inte lägger örat intill chassit
[ MacBook Pro Retina 13 | 16GB ram | 256GB PCIe SSD | OS X(main), Arch ]

Trädvy Permalänk
Medlem
Plats
Berget
Registrerad
Jun 2002

Något liknande kan användas.

HANDLE globalProcessHandle = NULL; bool IsMyProcessRunning() { return (globalProcessHandle != NULL); } void StartStopProcess(LPSTR executable, LPSTR cmdline) { if (IsMyProcessRunning()) { TerminateProcess(globalProcessHandle, 0); } else { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); ZeroMEmory(&pi, sizeof(pi)); si.cb = sizeof(si); if (CreateProcess(executable, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { // ok globalProcessHandle = pi.hProcess; } else { // gick inte globalProcessHandle = NULL; } } }

Trädvy Permalänk
Medlem
Plats
sthlm
Registrerad
Jul 2004

@toj_ts: TerminateProcess modifierar inte det första argumentet, vilket betyder att efter en "Start" så kommer den alltid att försöka stoppa den gamla processen.

Hursomhelst så tycker jag du ska använda dig av waitforsingleobject (körandes i en egen tråd om du ska ha ett GUI) alternativt polla getexitcodeprocess.