我似乎无法使用AssignProcessToJobObject函数将当前进程分配给由CreateJobObject给出的作业对象句柄。这已经在StackOverflow上问了几次,但到目前为止,没有任何解决方案(通常归结为嵌入UAC清单)似乎适用于我。如何将当前进程分配给新创建的作业对象?
我在Windows 7上为此使用MSVC9。下面是我的示例应用程序和一个小清单,我嵌入源代码(这理应解决了这个问题 - 但不适合我):
我的示例应用程序(main.cpp
):
#include <windows.h>
static void dumpLastError()
{
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL);
OutputDebugStringA((LPTSTR)lpMsgBuf);
LocalFree(lpMsgBuf);
}
int main()
{
HANDLE job = CreateJobObjectA(NULL, "demo job 123");
if (!job) {
OutputDebugStringA("CreateJobObject failed");
dumpLastError();
return 1;
}
if (!AssignProcessToJobObject(job, GetCurrentProcess())) {
OutputDebugStringA("AssignProcessToJobObject failed");
dumpLastError();
return 1;
}
return 0;
}
的UAC清单(main.exe.manifest
):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<ms_asmv3:trustInfo xmlns:ms_asmv3="urn:schemas-microsoft-com:asm.v3">
<ms_asmv3:security>
<ms_asmv3:requestedPrivileges>
<ms_asmv3:requestedExecutionLevel level="requireAdministrator"/>
</ms_asmv3:requestedPrivileges>
</ms_asmv3:security>
</ms_asmv3:trustInfo>
</assembly>
我通过运行
cl main.cpp
mt -manifest main.exe.manifest -outputresource:main.exe;1
生成此示例
不幸的是,在尝试执行AssignProcessToJobObject
调用时,在这些步骤后运行我的main.exe
示例仍然会在调试输出中产生“访问被拒绝”错误。有人知道这是为什么吗?
你是否在使用cygwin?或者是在cmd窗口中构建/运行命令? – 2010-12-08 12:20:56
@Ryan Calhoun:不,我没有使用Cygwin,但我使用PyCmd(一个简单的cmd.exe替换)。这是一个有趣的问题!我只是从cmd.exe中试过,现在它似乎工作!奇。 – 2010-12-08 12:47:31