J'ai eu besoin d'une fonction de ce style et après avoir cherché, j'ai trouvé un bout de code sur RK, une fois le code compris j'ai tout recoder à ma "façon" & ça donne cela:
CODE |
DWORD GetPIDByProcName(LPSTR lpProcName){ |
Voici l'entête de la fonction (vous pouvez changer son nom ..) elle retournera une DWORD soit une unsigned long (long et int sont égal dans les CPU 32bits pas sûr pour les autres) quant à l'argument c'est un char*, donc un string.
CODE |
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); PROCESSENTRY32 pe32; DWORD dwPID=0; |
hSnapShot est un handle qui sert à identifier l'endroit où est stocker en mémoire l'information CreateToolhelp32Snapshot, cette dernière permet de recupérer toutes les informations des process et ses threads en mémoire, concernant ses arguments, la première est une constante qui dit à la fonction qu'il doit prendre _uniquement_ les process, le second, doit être NULL (donc "=0") dû à la première constante.
pe32 est une structure qui nous servira à contenir les infos courrante.
dwPID est une DWORD (unsigned long) qui contiendra notre PID voulu.
CODE |
if(hSnapShot==INVALID_HANDLE_VALUE){ MessageBox(NULL,"Erreur dans fonction CreateToolhelp32Snapshot",NULL,MB_OK); ExitProcess(0); } Process32First(hSnapShot,&pe32); |
Le premier test, permet de savoir si la fonction CreateToolhelp32Snapshot a échoué.
Ensuite on commence à recupérer les infos du premier process.
CODE |
do{ if(!_stricmp(pe32.szExeFile, lpProcName)){ dwPID=pe32.th32ProcessID; break; } } while(Process32Next(hSnapShot,&pe32)); |
Le do while permet de faire une boucle tant que la condition est "VRAI" (situé dans le while) donc ici, on commence par tester avec les infos que nous avait renvoyé Process32First ensuite le if est une routine permettant de copier le PID dans notre var si le nom des process sont identiques. _stricmp permet de comparer 2 strings sans distinction Maj ou Min (si on compare avec cette fonction Dark et dArk elle renverra "FAUX") le "!" c'est bien connu des coders en C car cette fonction renvoie FAUX si les strings sont les mêmes, le "!" permet d'inverser la logiquement de bit et donc vous aurez "VRAI" à la place de "FAUX". Si c'est "VRAI" on copie le PID contenue dans la structure, et le break permet de sortir de la boucle sans à avoir à effectuer les autres actions ! (temps au CPU "sauvé" HalleJulah)
Enfin le premier process n'était pas le bon, on continue avec ette fois-ci Process32Next() (si on a effectué tous les process le fonction doit retourner "FAUX", ce qui casse la boucle et donc vous vous retrouvez sans PID (nom du proc incorrect ?).
CODE |
CloseHandle(hSnapShot); return dwPID; } |
CloseHandle permet simplement de néttoyer le handle en mémoire (ne jamais l'oublier), quant au return, permet de retourner la valeur du PID du proc voulu.
Voila voila il y a sans doute une meilleur technique pour optiminer le code mais celle marche, alors j'vais pas m'emmerder plus longtemps à coder ce genre de fonction

allez maintenant avec ça vous êtes en mesure de recupérer le handle d'un proc par l'intermédiare de OpenProcess
____________________