2017-10-17 102 views
1

我试图使用作为PyWin32包的一部分的win32job API。我想这样做:在python32,win32job,CreateJobObject函数中,如何为name参数传递NULL?

win32job.CreateJobObject(None, NULL) 

我想通过NULL作为第二个参数如下记载:

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

If lpName is NULL, the job is created without a name.

如何传递NULL?

这是我希望的工作,但不会:

win32job.CreateJobObject(None, None) 

错误:

TypeError: None is not a valid string in this context 

(方的问题......如果有人知道如何查看与相关JobObjects在Windows中的一个过程,这将是有益的。)

+0

如果有帮助,我下载了pywin32源代码。它似乎使用swig: '''// @pyswig | CreateJobObject |创建或打开一个作业对象。 PyHANDLE CreateJobObject( SECURITY_ATTRIBUTES * lpJobAttributes,// @pyparm | jobAttributes || WCHAR * lpName); // @pyparm unicode | name ||'''' –

回答

1

您可以使用win32job.CreateJobObject(None, "")。虽然没有在[MSDN]: CreateJobObject function上指定,但空字符串的作用与NULL一样。

根据上面的链接:

If the function succeeds, the return value is a handle to the job object. The handle has the JOB_OBJECT_ALL_ACCESS access right. If the object existed before the function call, the function returns a handle to the existing job object and GetLastError returns ERROR_ALREADY_EXISTS.

我写了一个小ç程序演示用途:

#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; 
} 

输出(内置与VStudio 2015年社区版跑):

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 

你可以看到,对于"dummy0""dummy",每一次(除了1 ST)创建一个新的对象时,该函数返回一个新的HANDLE,但失败(GetLastError返回183(这是ERROR_ALREADY_EXISTS))。这不会发生NULL空字符串("")名称(从这里我明白,每次调用都会创建一个新对象,而不是递增现有对象的引用)。


的Python “翻译”:

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) 

输出(相同的结果Ç的情况下 - 这是自然的,因为的Python功能仅包裹下级Ç ):

(py35x64_test) c:\Work\Dev\StackOverflow\q46800142>"c:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" a.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 


关于“方”的问题:不幸的是,我不熟悉那个话题。

相关问题