Programmation api Windows avec c: référence non définie à OpenJobObject

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:

  • Compilateur: gcc, clang
  • Différentes versions pour _WIN32_WINNT (0x500,0x600,0x601)
  • OS différent: Windows 7 et Windows Server 2008
  • “OpenJobObjectW” et “OpenJobObjectA”
  • Définir WINVER

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.