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

Permalänk

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.

Visa signatur

[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 ]

Permalänk
Medlem

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()

Permalänk

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

Visa signatur

[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 ]

Permalänk
Medlem

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; } } }

Permalänk
Medlem

@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.