Python Ctypes Null终止字符串块

Eri*_*itt 2 python ctypes

我正在使用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'
Run Code Online (Sandbox Code Playgroud)

然而,我运行了一个ctypes变量,它截断了信息:

ctypes.c_wchar_p(lpEnvironment)
c_wchar_p(u'XAUTHORITY=/home/username/.Xauthority')
Run Code Online (Sandbox Code Playgroud)

如何正确传递lpEnvironment信息?

eph*_*ent 6

据我所知,整个字符串确实ctypes在一个方向正确地穿过边界,但在回来的路上被截断.

>>> ctypes.create_string_buffer('abc\0def').value
'abc'
>>> ctypes.create_string_buffer('abc\0def').raw
'abc\x00def'
Run Code Online (Sandbox Code Playgroud)

不幸的是(至少对我来说,Linux上的Python 2.6.5)结果create_unicode_buffer没有.raw属性.然而,

>>> ctypes.wstring_at(ctypes.create_unicode_buffer(u'abc\0def), 7)
u'abc\x00def'
Run Code Online (Sandbox Code Playgroud)

按预期工作.