Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用c进行Windows api编程:对OpenJobObject的未定义引用_C_Windows_Winapi - Fatal编程技术网

使用c进行Windows api编程:对OpenJobObject的未定义引用

使用c进行Windows api编程:对OpenJobObject的未定义引用,c,windows,winapi,C,Windows,Winapi,我正在尝试编写一个简短的程序,它允许我根据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>

我正在尝试编写一个简短的程序,它允许我根据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);

}
\ifndef\u WIN32\u WINNT
#定义_WIN32_WINNT 0x600
#恩迪夫
#定义作业\对象\终止0x0008
#包括
#包括
#包括
#包括
LPTSTR作业对象名称;
处理jobObj;
int main(int argc,TCHAR*argv[]){
jobObjectName=argv[0];
jobObj=OpenJobObject(JOB\u OBJECT\u TERMINATE,FALSE,jobObjectName);
TerminateJobObject(jobObj,0);
}
使用“gcc TerminateJobObject.c-o TerminateJobObject”编译时出现以下错误:

TerminateJobObject.c:在函数“main”中
C:/:TerminateJobObject.C:(.text+0x62):对“OpenJobObject”的未定义引用
collect2:ld返回了1个退出状态
我不明白为什么链接器不能解析OpenJobObject。TerminateJobObject链接正确,并且也来自windows api

到目前为止,我尝试的是:

  • 编译器:gcc,clang
  • WIN32 WINNT的不同版本(0x500,0x600,0x601)
  • 不同的操作系统:Windows 7和Windows server 2008
  • “OpenJobObjectW”和“OpenJobObjectA”
  • 定义WINVER
我对c和WindowsAPI不是很有经验,在这个问题上找不到任何东西,所以如果有人能给我指点方向,那就太好了


Api参考:我解决了它。问题在于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中找到的

接下来,我将调用更改为“OpenJobObjectA”,现在它可以工作了。:) 谢谢你的帮助


编辑:正如汉斯·帕桑特所指出的,一个更干净的方法可能是迁移到mingw-64或其他什么地方。

在来到这里之前,我们为此付出了很大的努力。是啊,这么糟糕的一天。祝你好运。听起来很奇怪,打开详细链接并确保
Kernel32.lib
确实被拉入。最后,虽然它应该没有什么区别,
0x0600
而不是
0x600
,因为这是一个链接器错误,但正如WhozCraig所提到的,您需要集中精力确保Kernel32.lib也被链接。首先:感谢您的输入!我尝试了0x0600,但没有效果。实际上,我不知道如何确保kernel32.lib被加载,但谷歌的一项快速研究告诉我,它一直都是gcc所必需的。我试着用-v编译,输出最令人困惑。忽略现有目录,搜索不存在的目录。但是我发现了一些有趣的东西:c:/mingw/include中的winbase.h(通过windows.h包含)缺少OpenJobObject函数,例如TerminateJobObject。我很确定这就是问题所在。我将集中讨论这个问题。与您的问题无关:如果您对C/Windows API不太熟悉,您可能希望选择一个更合适的工具:免费提供,并且与Windows SDK兼容。搜索所有包含文件,看看是否可以找到OpenJobObject。它可能只是被遗漏了。如果是这样,您可以自己编写定义:从Microsoft下载Windows平台SDK,并找到OpenJobObject的定义。将Microsoft标头中的其他几个函数的定义与MinGW标头中的定义进行比较,查看它们是如何更改的,然后对OpenJobObject执行相同的操作。一旦你让它工作起来,你甚至可以把它作为你自己问题的答案发布出来。:-)我希望你意识到这是你会后悔的。像这样对头文件进行黑客攻击有一个创建“仅在我的机器上编译”项目的诀窍。最好将它放在源代码中,由#ifndef OpenJobObject包装。改用mingw-w64是可持续的解决方案。我不同意。程序的c代码实际上很好,而不是“仅我的机器”,因为windows api支持OpenJobObject,任何实现它的头都应该支持OpenJobObject。这就是我决定进行api更改的原因。事实上,人们可以将其视为一种修复(即使只是局部修复)。如果我使用OpenJobObject编写另一个程序,它将正常工作,而不是再次添加额外的def。我同意切换到MingW64,但由于它在特定项目的专用Virtual机器上运行,因此没有必要。我将添加一个关于迁移以获得干净解决方案的部分。
#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);