Python Ctypes Null终止字符串块

时间:2010-12-08 23:51:51

标签: 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'

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

ctypes.c_wchar_p(lpEnvironment)
c_wchar_p(u'XAUTHORITY=/home/username/.Xauthority')

如何正确传递lpEnvironment信息?

1 个答案:

答案 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'

按预期工作。