我正在使用CreateProcessWithLogonW的ctypes实现,一切正常,除了我无法弄清楚如何处理这一部分:
指向新进程的环境块的指针。如果此参数为NULL,则新进程使用调用进程的环境。
环境块由以null结尾的以null结尾的字符串块组成。每个字符串的格式如下:
名=值\ 0
要生成原始字符串,我执行以下操作:
lpEnvironment = '\0'.join(['%s=%s' % (k, os.environ[k]) for k in os.environ]) + '\0\0'
print lpEnvironment
'XAUTHORITY=/home/username/.Xauthority\x00MUTT_DIR=/home/username/.mutt\x00LASTDIRFILE=/home/username/.lastpwd-geany\x00LOGNAME=username\...\x00\x00'
然而,我运行了一个ctypes变量,它会截断信息:
ctypes.c_wchar_p(lpEnvironment)
c_wchar_p(u'XAUTHORITY=/home/username/.Xauthority')
如何正确传递lpEnvironment信息?
答案 0 :(得分:6)
据我所知,整个字符串确实在一个方向上正确地穿过ctypes
边界,但在回来的路上被截断。
>>> ctypes.create_string_buffer('abc\0def').value
'abc'
>>> ctypes.create_string_buffer('abc\0def').raw
'abc\x00def'
不幸的是(至少对我来说,Linux上的Python 2.6.5)create_unicode_buffer
的结果没有.raw
属性。然而,
>>> ctypes.wstring_at(ctypes.create_unicode_buffer(u'abc\0def), 7)
u'abc\x00def'
按预期工作。