Je ne peux pas sembler utiliser la fonction AssignProcessToJobObject pour affecter le processus en cours à un handle d'objet de travail donné par CreateJobObject. Cela a déjà été demandé à plusieurs reprises sur StackOverflow, mais jusqu'à présent, aucune des solutions (qui se résument habituellement à incorporer un manifeste UAC) ne semble fonctionner pour moi. J'utilise MSVC9 sur Windows 7 pour cela. Voici le code source pour mon exemple d'application et un petit manifeste que je suis l'intégration (qui fixe soi-disant problème - mais pas pour moi):Comment affecter le processus en cours à un nouvel objet de travail?
Mon exemple d'application (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;
}
Le manifeste 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>
Je construis cet exemple en exécutant
cl main.cpp
mt -manifest main.exe.manifest -outputresource:main.exe;1
Malheureusement, l'exécution de mon exemple main.exe
après ces étapes génère toujours une erreur «Accès refusé» dans la sortie de débogage lors de la tentative de l'appel AssignProcessToJobObject
. Est-ce que quelqu'un sait pourquoi c'est?
Utilisez-vous cygwin par hasard? Ou sont vos commandes build/run dans une fenêtre cmd? –
@Ryan Calhoun: Non, je n'utilise pas Cygwin mais j'utilise PyCmd (un simple remplacement de cmd.exe). C'est une question intéressante! Je viens de l'essayer depuis cmd.exe et maintenant ça a l'air de marcher! Impair. –