Witam! Mam następujący problem: chciałbym napisać program,który będzie mierzył czas działania konkretnego zadania(jednego z wielu) jakie wykonuje komercyjna aplikacja. Dla ustalenia uwagi przyjmijmy, ze jest to program okienkowy szyfrujący ,deszyfrujący , podpisujący dane itd. Z tego co zdążyłem zauważyć(z pomocą Process Explorera), to za każde z tych zadań jest odpowiedzialny inny proces , a właściwie wątek. Myślałem ,żeby odnieść się do tych wątków poprzez uchwyty i użyć funkcji API GetThreadTimes(). Ale w programie Process Explorer jest widoczny tylko punkt wejścia funkcji w bibliotece dll. Myślałem żeby użyć funkcji GetCurrentThread() , ale nie wiem jak ją umieścić w swoim programie, aby zwracała mi uchwyt do wątku, który chcę zbadać. Będę wdzięczny za wszystkie wskazówki i rady.
Najpierw spróbowałbym dobrać się do pętli komunikatów, hook na komunikaty jest najszybciej do zrobienia. Może uda ci się na podstawie komunikatów określić co się dzieje w aplikacji.
W przeciwnym wypadku to podstawową rzeczą jest uruchomienie tej aplikacji jako proces potomny twojej, czyli przez CreateProcess. Wtedy masz dużo więcej uprawnień do tego procesu.
Witam! Gdy próbuję uruchomić proces za pomocą CreateProcess(podając ścieżkę dostępu do pliku exe), to program się kompiluje, ale wywala błąd systemowy i chce wysyłać raport o błędach. W czym może tkwić problem?
W błędnym kodzie. Pokaż go.
OTO kod:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <iostream>
int main()
{
// jakies wczesniejsze instrukcje
//DWORD dwMiliseconds = GetTickCount();
/* Utworzenie procesu */
CreateProcess( "C:\Program Files\PGP Corporation\PGP for Windows XP\PGPmail.exe",
NULL, NULL,
NULL, FALSE, CREATE_NEW_PROCESS_GROUP,
NULL, NULL, NULL, NULL );
/* Oczekiwanie az obiekt jadra bedzie wolny,
- czyli innymi slowy az proces sie zakonczy
*/
//WaitForSingleObject( hProcess, INFINITE );
/* Obliczanie ile czasu uplynelo,
- poprzez obliczenie roznicy
*/
//dwMiliseconds = GetTickCount() - dwMiliseconds;
//std::cout << "Proces pracowal przez: " << dwMiliseconds << " ms. ";
//getchar();
return 0;
}
Dwa ostatnie parametry CreateProcess nie mogą być NULL. Przedostatni to wskaźnik na strukturę STARTUPINFO którą musisz wypełnić. Ostatni to wskaźnik na strukturę do której zwracane są informacje o utworzonym procesie.
Czytaj dokumentację i forum !
http://msdn.microsoft.com/en-us/library/ms682425.aspx
http://msdn.microsoft.com/en-us/library/ms682512.aspx
http://4programmers.net/Forum/search.php?q=CreateProcess
Problem czasu działania wątku mam już rozwiązany.Ale pojawiło się następne pytanie: Jak sprawdzić czy wątek jest aktywny?Chodzi mi o czas, w którym wątek faktycznie coś wykonuje(np. szyfruje dane jak program PGP) w tym sensie, że widać w ProcessExplorerze wysokie użycie procesora