J’essaie d’écrire un programme court qui me permet de terminer un object de travail Windows par son nom. Voici le code (raccourci) du fichier TerminateJobObject.c:
#ifndef _WIN32_WINNT #define _WIN32_WINNT 0x600 #endif #define JOB_OBJECT_TERMINATE 0x0008 #include #include #include #include LPTSTR jobObjectName; HANDLE jobObj; int main(int argc, TCHAR *argv[]){ jobObjectName = argv[0]; jobObj = OpenJobObject(JOB_OBJECT_TERMINATE,FALSE,jobObjectName); TerminateJobObject(jobObj,0); }
J’ai l’erreur suivante lors de la compilation avec “gcc TerminateJobObject.c -o TerminateJobObject”:
TerminateJobObject.c: In function 'main' C:/:TerminateJobObject.c:(.text+0x62):undefined reference to 'OpenJobObject' collect2: ld returned 1 exit status
Je ne comprends pas pourquoi l’éditeur de liens ne peut pas résoudre OpenJobObject. TerminateJobObject est lié correctement et provient également de l’API Windows.
Ce que j’ai essayé jusqu’ici:
Je ne suis pas très expérimenté avec c et windows api et ne trouve rien sur ce problème, alors ce serait génial si quelqu’un pouvait me diriger dans une direction.
Référence Api: OpenJobObject
Je l’ai résolu. Le problème était / est que le fichier d’en-tête winbase.h de mingw32 (qui est inclus via windows.h) ne contient pas la définition de fonction pour OpenJobObject, comme le suspectait Harry Johnston.
J’ai ajouté les lignes suivantes à … / mingw / include / winbase.h
#define OpenJobObject __MINGW_NAME_AW(OpenJobObject) WINBASEAPI HANDLE WINAPI OpenJobObjectA (DWORD dwDesiredAccess, WINBOOL bInheritHandle, LPCSTR lpName); WINBASEAPI HANDLE WINAPI OpenJobObjectW (DWORD dwDesiredAccess, WINBOOL bInheritHandle, LPCWSTR lpName);
Que j’ai trouvé dans le winbase.h de mingw-w64
Ensuite, j’ai changé l’appel à “OpenJobObjectA” et maintenant cela fonctionne. 🙂 Merci pour l’aide!
Edit: Comme Hans Passant l’a fait remarquer, une manière plus propre serait probablement de migrer vers mingw-64 ou autre chose.