我正在尝试编写一个短程序,允许我通过其名称终止Windows作业对象。下面是文件TerminateJobObject.c:
的(缩短)代码#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x600
#endif
#define JOB_OBJECT_TERMINATE 0x0008
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <limits.h>
LPTSTR jobObjectName;
HANDLE jobObj;
int main(int argc, TCHAR *argv[]){
jobObjectName = argv[0];
jobObj = OpenJobObject(JOB_OBJECT_TERMINATE,FALSE,jobObjectName);
TerminateJobObject(jobObj,0);
}
使用"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
我不明白为什么链接器不能解析OpenJobObject。TerminateJobObject链接正确,也来自windows api。
我试过了:
- 编译器:gcc, clang
- _WIN32_WINNT (0x500,0x600,0x601)的不同版本
- 不同的操作系统:Windows 7和Windows server 2008
- "OpenJobObjectW"one_answers"OpenJobObjectA" 定义WINVER
我对c和windows api不是很有经验,在这个问题上找不到任何东西,所以如果有人能给我指出一个方向,那就太好了。
Api reference: OpenJobObject
我解决了。问题是mingw32的头文件winbase.h(通过windows.h包含)缺少OpenJobObject的函数定义,如Harry Johnston所怀疑的。
我添加了以下行到…/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);
在winbase.h from mingw-w64
接下来,我将调用改为"OpenJobObjectA",现在它工作了。:)谢谢你的帮助!
编辑:正如Hans Passant指出的那样,更干净的方法可能是迁移到mingw-64或其他版本。