Я не могу использовать функцию AssignProcessToJobObject, чтобы назначить текущий процесс дескриптору объекта задания, заданному CreateJobObject. Это уже несколько раз задавали в StackOverflow, но пока что ни одно из решений (которое обычно сводится к внедрению манифеста UAC), похоже, работает на меня.Как назначить текущий процесс новому созданному объекту задания?
Я использую MSVC9 для Windows 7 для этого. Вот исходный код для моего приложения образца и небольшой манифест я вложению (который якобы фиксирует проблему - но не для меня):
Мой пример приложения (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;
}
ОАК манифеста (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
К сожалению, запуск моего образца main.exe
после этих шагов по-прежнему приводит к ошибке «Доступ запрещен» при отладочном выходе при попытке вызова AssignProcessToJobObject
. Кто-нибудь знает, почему это так?
Вы используете cygwin случайно? Или ваши команды сборки/запуска в окне cmd? – 2010-12-08 12:20:56
@ Ryan Calhoun: Нет, я не использую Cygwin, но я использую PyCmd (простая замена cmd.exe). Это интересный вопрос! Я просто попробовал его из cmd.exe, и теперь он работает! Странный. – 2010-12-08 12:47:31