我想调用一个外部库函数,该函数返回a NULL-terminated array of NULL-terminated strings。Python ctypes - 如何处理字符串数组
kernel32 = ctypes.windll.kernel32
buf = ctypes.create_unicode_buffer(1024)
length = ctypes.c_int32()
if kernel32.GetVolumePathNamesForVolumeNameW(ctypes.c_wchar_p(volume),
buf, ctypes.sizeof(buf), ctypes.pointer(length)):
## ???
换句话说:
buf = ctypes.create_unicode_buffer(u'Hello\0StackOverflow\0World!\0')
如何访问的buf
所有内容作为一个Python列表?buf.value
只能达到第一个NULL。
在C这将是这样的:
while (*sz) {;
doStuff(sz);
sz += lstrlen(sz) + 1;
}
“这个呼叫要找一份合适的卷名是有点痛” - 'mountvol'将列出所有卷的GUID。 – grawity 2010-06-19 18:49:26
“当我运行这个时,所有的列表都只包含一个名字,但如果你仔细检查长度,那么它们就包含在返回的缓冲区中。” - 几乎总是这样,是的,但是除了驱动器盘符之外,我的一些可移动驱动器可以通过Unix风格的安装点到达。无论哪种方式,我只是寻找一个通用的解决方案,不一定''GetVolume ...()' - 具体。但是'split('\ 0')'现在已经够好了。 – grawity 2010-06-19 18:50:19