Do stworzenia procesu w powloce mozesz uzyc fork, a nastepnie przy uzyciu, np. execl zastapic przestrzen pamieci utworzonego procesu przez proces, ktory podasz w funkcji execl.
Oczywiscie w funkcji execl nie podajesz adresu procesu w pamieci tylko nazwe pliku i argumenty do uruchomienia.
Te funkcje sa zdefiniowane w unistd.h, wiec i na windowsie powinno dzialac.
Co do tego, ze funkcja system() otwiera najpierw konsole to niewiem dlaczego tak sie dzieje, a jesli chodzi o exec** to nigdy nie probowalem uruchomic programu okienkowego, wiec niewiem jak to bedzie wygladac.
To czy program(plik binarny w formacie PE) ma sie uruchamiac z konsola, czy bez jest zdefiniowane w strukturze IMAGE_OPTIONAL_HEADERS w polu SubSystem. Z tego co pamietam wartosc 3 okresla ze ma sie uruchomic z konsola, ale nie jestem pewny, mozliwe ze 2. Zobacz winnt.h
Sproboj REG ADD sciezka_w_rejesrze /v nazwa /d wartosc lub REG DELETE. Mozesz dodac /f zeby zmiany zaszly bez potwierdzenia. Mozesz jeszcze regedit nazwa.reg, aby uruchomic plik reg ktory doda co tam chcesz do rejestru. Tak sie robi w plikach bat, wiec mysle ze da rade i przez system();
Do operacji na rejestrze w winapi masz RegCreateKey, RegQueryValue, RegGetValue itd. Na MSDN znajdziesz wiecej informacji na ten temat.
//q: chcialem wywalic ten watek, aleś go na koniec uratował;)