Erreur ennuyeuse...

Résolu
Vortigaunt Messages postés 11 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 23 mars 2008 - 9 mars 2008 à 17:12
Vortigaunt Messages postés 11 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 23 mars 2008 - 10 mars 2008 à 16:20
Bonjour à tous,

J'ai un petit problème sous C::B.

J'aimerai obtenir, à partir d'un processus, son chemin absolu. Je n'ai pas de problème lors de l'ouverture du processus, ni de l'affichage de son nom (style msnmgr.exe).

Le problème se situe lorsque j'utilise la fonction GetModuleFileNameEx(), car sous code::blocks, impossible à faire fonctionner sans l'erreur du compilateur: undefined reference to `GetModuleFileNameExA@16'

Quelqu'un aurait-il une idée ?

Merci d'avance..

17 réponses

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
9 mars 2008 à 19:02
C'est normal car tu n'as pas alloué d'espace pour accueillir les chemins. Dans ton code test est déclaré seulement comme pointeur. Tu dois faire par exemple:
char test[260];
//....
getmodulefilenameex(hOpenPro,NULL,test,taille);
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
9 mars 2008 à 17:36
Salut,
Tu as bien inclue psapi.h et linker avec psapi.lib?

Neo_Fr
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
9 mars 2008 à 17:37
Salut,
Cette fonction se trouve dans psapi.dll. Il faudra donc lier ton projet avec psapi.lib. Une option du linker du genre -lpsapi serait aussi possible. La dernière solution reste le chargement dynamique avec LoadLibray() et GetProcAddress().
Vortigaunt Messages postés 11 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 23 mars 2008
9 mars 2008 à 17:42
Bonjour, et merci pour vos réponses.

Je vais essayer, je vous tiens au courant.

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Vortigaunt Messages postés 11 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 23 mars 2008
9 mars 2008 à 17:48
J'ai essayé de linker psapi.lib, mais çà ne fonctionne pas. J'ai ensuite essayé -lpsapi, marche pas non plus.

Comment utiliser LoadLibrary() et GetProcAddress() ?
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
9 mars 2008 à 18:15
//Définir un type de pointeur pour GetModuleFileNameEx():

typedef DWORD (WINAPI* PGETMODULEFILENAMEEX) (HANDLE, HMODULE, LPTSTR, DWORD);
// Charger la DLL psapi.dll
HMODULE hDll=LoadLibrary("psapi.dll");
// Obtenir l'adresse de la fonction GetMuduleFileNameExA():
PGETMODULEFILENAMEEX getmodulefilenameex=(PGETMODULEFILENAMEEX)GetProcAddress(hDll,"GetModuleFileNameExA");
//Appel de la fonction:
getmodulefilenameex(....);
//....
// Libérer la DLL en fin d'utilisation:
FreeLibrary(hDll);
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
9 mars 2008 à 18:17
Essaye ce code pour voir:

#include <tlhelp32.h>
#include

DWORD __stdcall GetPID(LPSTR lpszProcessName)
{
HANDLE hSnapshot;
PROCESSENTRY32 ProcessEntry;
DWORD dwPID = 0;
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hSnapshot == INVALID_HANDLE_VALUE) return 0;
ProcessEntry.dwSize = sizeof(PROCESSENTRY32);
if(!Process32First(hSnapshot, &ProcessEntry)) { CloseHandle(hSnapshot); return 0; }
while(1)
{
if(!strcmp(lpszProcessName, ProcessEntry.szExeFile))
{
dwPID = ProcessEntry.th32ProcessID;
break;
}
if(!Process32Next(hSnapshot, &ProcessEntry)) break;
}
CloseHandle(hSnapshot);
return dwPID;
}

DWORD __stdcall GetProcessPath(DWORD dwPID, LPSTR lpszRet)
{
HANDLE hProcess;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, dwPID);
if(!hProcess) return 1;
if(!GetModuleFileNameEx(hProcess, 0, lpszRet, MAX_PATH)) { CloseHandle(hProcess); return 1; }
CloseHandle(hProcess);
return 0;
}

char szProcessPath[MAX_PATH+4];
GetProcessPath(GetPID("msnmsgr.exe"), szProcessPath);
MessageBox(0, szProcessPath, 0, 0x40);

Chez moi sous Devcpp sa compile sans pbs..

Neo_Fr
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
9 mars 2008 à 18:31
Neo_Fr >> Le problème se situe au niveau de l'édition des liens. Même si ça compile correctement, l'exécutable ne sera généré qu'après avoir ajouté la liaison avec psapi.dll. Si ton exe est généré, ça prouve que ton projet est déjà lié avec cette dll. Il s'agit sûrement d'une option du linker présente dans ton projet.
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
9 mars 2008 à 18:39
Nan j'ai bien ajouter manuellement -lpsapi ds les options, ce qui m'étonne c'est que ca ne compile pas chez lui alors qu'on utilise le meme compilateur

Neo_Fr
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
9 mars 2008 à 18:43
undefined reference to `GetModuleFileNameExA@16'
est un message d'erreur de l'éditeur de liens.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
9 mars 2008 à 18:47
Montre lui comment ajouter -lpsapi aux options du linker.
Vortigaunt Messages postés 11 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 23 mars 2008
9 mars 2008 à 18:53
Re,

Cà fonctionne, j'ai réussi grâce au code donné par racpp plus haut, merci.

J'ai maintenant un autre petit problème. Voici mon code:

void ProcessList()
{
using namespace std;

HANDLE hSnapPro, hOpenPro;
HINSTANCE library;
PROCESSENTRY32 pe = {sizeof(PROCESSENTRY32)};
LPSTR test;
BYTE taille;

cout << "\n\n-> Process List" << endl << endl;
hSnapPro = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

HMODULE hDll=LoadLibrary("psapi.dll");
PGETMODULEFILENAMEEX getmodulefilenameex=(PGETMODULEFILENAMEEX)GetProcAddress(hDll,"GetModuleFileNameExA");


if(Process32First(hSnapPro, &pe))
{
do
{
hOpenPro = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pe.th32ProcessID);

taille = MAX_PATH;

getmodulefilenameex(hOpenPro,NULL,test,taille);

cout << test << endl;

CloseHandle(hOpenPro);

}while(Process32Next(hSnapPro, &pe));
}
CloseHandle(hSnapPro);
FreeLibrary(hDll);
}

Ce que je veux arriver à faire est lister tous les processus avec leur chemin absolu. Cependant, à la console je n'affiche que des caractères illisibles.

Une idée ?

PS: Merci à tous les deux !
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
9 mars 2008 à 18:57
Ton pointeur test pointe nul part, remplace LPSTR test par
char test[MAX_PATH+4];

Neo_Fr
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
9 mars 2008 à 19:02
Et puis la constante MAX_PATH est definie a 260, tu peux donc pa la stoquer ds un BYTE

Neo_Fr
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
9 mars 2008 à 19:04
J'ai posté la même réponse car au moment de l'écriture ta réponse n'était pas présente.
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
9 mars 2008 à 19:08
C'est pas grave au moins tu lui explique bien :D

Neo_Fr
Vortigaunt Messages postés 11 Date d'inscription mardi 4 mars 2008 Statut Membre Dernière intervention 23 mars 2008
10 mars 2008 à 16:20
Bonjour,

Merci beaucoup les gars, cela fonctionne parfaitement maintenant !

Un grand merci, et à une prochaine fois j'espère :o)
Rejoignez-nous