2009-07-01 18 views
5

Czy ktoś może mi powiedzieć, jak utworzyć proces w VC++? W tym procesie muszę wykonać komendęJak utworzyć proces w C++ w systemie Windows?

regasm.exe testdll /tlb:test.tlb /codebase 

.

+1

Wcale nie dupe. Inne pytanie zakłada, że ​​CreateProcess to jedyny sposób na zrobienie tego. Ten jest bardziej otwarty. Dla przypomnienia, sugerowane dupe było http://stackoverflow.com/questions/42531/how-do-i-call-createprocess-in-c-to-launch-a-windows-executable - Wyjąłem to pytania, ponieważ uważam, że nie jest to dobra forma do edytowania treści. Uważam, że należy to uwzględnić w komentarzach. Jeśli zostanie zamknięty jako duplikat, SO sam doda to do pytania. – paxdiablo

Odpowiedz

4

Jeśli chcesz tylko wykonać polecenie synchroniczne (uruchom i czekaj), najlepiej jest po prostu użyć wywołania system() (patrz here), aby go uruchomić. Tak, wiem, że to strona Linux, ale C to standard, nie? :-)

Aby uzyskać dokładniejszą kontrolę nad tym, co się uruchamia, jak działa (synchronizacja/asynchronizacja) i wiele innych opcji, CreateProcess() (patrz here), a jego bracia, są prawdopodobnie lepsi, chociaż będziesz związane z platformą Windows (która może nie dotyczyć Ciebie bezpośrednio).

3

Użyj funkcji CreateProcess() do odrodzenia procesu, sprawdź wartość zwracaną, aby upewnić się, że wszystko zaczęło się dobrze, a następnie zamknij uchwyt do procesu i wątku lub użyj funkcji WaitForSingleObject(), aby poczekać, aż zakończy się, a następnie zamknij uchwyty.

10

regasm.exe (Registration Tool Assembly) dokonuje zmian w rejestrze systemu Windows, więc jeśli chcesz rozpocząć regasm.exe jak podwyższone proces można użyć następującego kodu:

#include "stdafx.h" 
#include "windows.h" 
#include "shellapi.h" 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
     SHELLEXECUTEINFO shExecInfo; 

     shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); 

     shExecInfo.fMask = NULL; 
     shExecInfo.hwnd = NULL; 
     shExecInfo.lpVerb = L"runas"; 
     shExecInfo.lpFile = L"regasm.exe"; 
     shExecInfo.lpParameters = L"testdll /tlb:test.tlb /codebase"; 
     shExecInfo.lpDirectory = NULL; 
     shExecInfo.nShow = SW_NORMAL; 
     shExecInfo.hInstApp = NULL; 

     ShellExecuteEx(&shExecInfo); 

     return 0; 
} 

shExecInfo.lpVerb = L"runas" oznacza, że ​​proces zostanie uruchomiony z podwyższonymi przywileje. Jeśli nie chcesz, po prostu ustaw shExecInfo.lpVerb na NULL. Ale pod Vistą lub Windows 7 wymagane jest prawo administratora do zmiany niektórych części rejestru Windows.

+0

To działa dobrze raczej powyżej. Ale tymczasem pyta, pod którym użytkownikiem musi działać. Możesz wyjaśnić ten program SHELLEXECUTEINFO shExecInfo; shExecInfo.lpVerb = L "runas"; – Cute

+0

Zmodyfikowałem l "run as" na wartość null, a następnie działa bez pytania. ok czym jest to oznaczenie L i jak powstał proces? – Cute

+0

L jest dla ciągu znaków Unicode. –

Powiązane problemy