我正在尝试编写一个简短的程序,该程序使我可以按其名称终止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。
到目前为止我尝试过的是:
我对C和Windows API的经验不是很丰富,并且无法找到关于此问题的任何信息,因此如果有人可以向我指出方向,那将是很好的。
api参考:OpenJobObject
我解决了 问题是/是mingw32的头文件winbase.h(包含在windows.h中)缺少了Harry Joston怀疑的OpenJobObject的函数定义。
我在... / 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);
我在mingw-w64的winbase.h中找到的
接下来,我将调用更改为“ OpenJobObjectA”,现在可以使用了。:) 谢谢您的帮助!
编辑:正如汉斯·帕桑特(Hans Passant)指出的,一种更干净的方法可能是迁移到mingw-64或其他东西。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句