2017-10-17 103 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 


關於「方」的問題:不幸的是,我不熟悉那個話題。

相關問題