En python con pywin32, win32job, el CreateJobObject función, ¿cómo puedo pasar NULL para el parámetro de nombre?

Estoy tratando de utilizar el win32job API que es parte de la PyWin32 paquete. Yo quiero hacer esto:

win32job.CreateJobObject(None, NULL)

Quiero pasar NULL como el segundo parámetro, como se indica a continuación:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms682409(v=vs 85).aspx

Si lpName es NULA, el trabajo se crea sin un nombre.

¿Cómo puedo pasar NULL?

Aquí es lo que yo esperaba que fuera a trabajar, pero no:

win32job.CreateJobObject(None, None)

De Error:

TypeError: None is not a valid string in this context

(Lado de la pregunta… si alguien sabe cómo ver JobObjects asociado con un proceso de Windows, que sería útil).

  • En caso de que ayuda, he descargado el pywin32 código fuente. Parece que el uso de lámpara: // @pyswig |CreateJobObject|Creates or opens a job object. PyHANDLE CreateJobObject( SECURITY_ATTRIBUTES *lpJobAttributes, // @pyparm <o PySECURITY_ATTRIBUTES>|jobAttributes|| WCHAR *lpName); // @pyparm unicode|name||
InformationsquelleAutor D. A. | 2017-10-17

1 Kommentar

  1. 1

    Puede utilizar win32job.CreateJobObject(None, ""). Aunque no está especificado en [La SEÑORA Docs]: CreateJobObjectA función, la cadena vacía actúa como NULL.

    Según el enlace de arriba:

    Si la función tiene éxito, el valor de retorno es un identificador de objeto de trabajo. El mango tiene la JOB_OBJECT_ALL_ACCESS derecho de acceso. Si el objeto al que existía antes de la llamada a la función, la función devuelve un identificador para el trabajo existente objeto y GetLastError devuelve ERROR_ALREADY_EXISTS.

    Escribí un pequeño C programa para demostrar los efectos de:

    #include <Windows.h>
    #include <stdio.h>
    
    #define EMPTY_TEXT ""
    #define DUMMY0_TEXT "dummy0"
    #define DUMMY1_TEXT "dummy1"
    
    #define DIM 12
    
    int main() {
        char* names[DIM] = { NULL, NULL, EMPTY_TEXT, EMPTY_TEXT, DUMMY0_TEXT,
                             DUMMY0_TEXT, EMPTY_TEXT, DUMMY0_TEXT, DUMMY1_TEXT,
                             NULL, DUMMY0_TEXT, DUMMY1_TEXT };
        HANDLE jobs[DIM] = { NULL };
        for (int i = 0; i < DIM; i++) {
            jobs[i] = CreateJobObjectA(NULL, names[i]);
            printf("%02d [%6s] CreateJobObject: %08X - GetLastError: %d\n", i, names[i], (long)jobs[i], GetLastError());
        }
        for (int i = 0; i < DIM; i++)
            CloseHandle(jobs[i]);
        return 0;
    }

    Salida (construido y corrió con VStudio 2015 Edición de la Comunidad):

    00 [(null)] CreateJobObject: 000000D8 - GetLastError: 0
    01 [(null)] CreateJobObject: 000000E0 - GetLastError: 0
    02 [      ] CreateJobObject: 00000088 - GetLastError: 0
    03 [      ] CreateJobObject: 000000F0 - GetLastError: 0
    04 [dummy0] CreateJobObject: 000000F4 - GetLastError: 0
    05 [dummy0] CreateJobObject: 000000F8 - GetLastError: 183
    06 [      ] CreateJobObject: 000000E8 - GetLastError: 0
    07 [dummy0] CreateJobObject: 000000FC - GetLastError: 183
    08 [dummy1] CreateJobObject: 00000100 - GetLastError: 0
    09 [(null)] CreateJobObject: 000000DC - GetLastError: 0
    10 [dummy0] CreateJobObject: 000000E4 - GetLastError: 183
    11 [dummy1] CreateJobObject: 00000104 - GetLastError: 183

    Se puede ver que para «dummy0» y «dummy», cada vez que (a excepción de la 1san) cuando se crea un nuevo objeto, la función devuelve un nuevo MANEJAR, pero falla (GetLastError devuelve 183 (que es ERROR_ALREADY_EXISTS)). Esto no sucede para NULL y la cadena vacía nombres (de aquí entiendo que se crea un nuevo objeto con cada llamada, en lugar de incrementar un objeto existente de referencia).


    Python «traducción» (code.py):

    #!/usr/bin/env python3
    
    import win32job
    import win32api
    
    DUMMY0 = "dummy00"
    DUMMY1 = "dummy11"
    
    JOB_NAMES = ["", "", DUMMY0, DUMMY0, "", DUMMY1, DUMMY0, "", DUMMY1]
    
    if __name__ == "__main__":
        handles = list()
        for i, name in enumerate(JOB_NAMES):
            h = win32job.CreateJobObject(None, name)
            print("{} [{:10}] {} - GetLastError: {}".format(i, name, h, win32api.GetLastError()))
            handles.append(h)
    
        for h in handles:
            win32api.CloseHandle(h)

    Salida (mismo resultado que en Cel caso – lo cual es natural ya que Python funciones sólo envuelven el nivel inferior C queridos):

    (py35x64_test) e:\Work\Dev\StackOverflow\q046800142>"c:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" code.py
    0 [          ] <PyHANDLE:300> - GetLastError: 0
    1 [          ] <PyHANDLE:308> - GetLastError: 0
    2 [dummy00   ] <PyHANDLE:580> - GetLastError: 0
    3 [dummy00   ] <PyHANDLE:584> - GetLastError: 183
    4 [          ] <PyHANDLE:588> - GetLastError: 0
    5 [dummy11   ] <PyHANDLE:592> - GetLastError: 0
    6 [dummy00   ] <PyHANDLE:596> - GetLastError: 183
    7 [          ] <PyHANDLE:600> - GetLastError: 0
    8 [dummy11   ] <PyHANDLE:604> - GetLastError: 183

    Respecto al «lado» de la pregunta: por desgracia, no estoy familiarizado con ese tema.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea