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 Johnston이 의심 한대로 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] 삭제
몇 마디 만하겠습니다