<p>这个程序使用<code>ctypes</code>从Python调用<a href="http://www.gnu.org/s/libc/manual/html_node/Copying-and-Concatenation.html#index-wcsncat-511" rel="noreferrer">^{<cd2>}</a>。它将<code>a</code>和<code>b</code>连接到缓冲区中,缓冲区的长度不足以让<code>a + b + (null terminator)</code>演示更安全的<code>n</code>版本。在</p>
<p>必须传递<code>create_unicode_buffer()</code>,而不是为非常数<code>wchar_t*</code>传递常规的不可变<code>u"unicode string"</code>,否则可能会出现分段错误。在</p>
<p>如果需要与之对话的函数返回UCS-2和<code>sizeof(wchar_t) == 4</code>,那么您将无法使用<code>unicode_buffer()</code>,因为它在{<cd12>}之间转换为Python的内部Unicode表示。在这种情况下,您可以使用<code>result.create_string_buffer()</code>和<code>result.decode('UCS2')</code>的组合,或者只创建一个<code>c_short</code>和{<cd16>}的数组。为了调试ODBC驱动程序,我不得不这么做。在</p>
<p>在示例.py公司名称:</p>
<pre><code>#!/usr/bin/env python
#-*- encoding: utf-8 -*-
import sys
from ctypes import *
example = cdll.LoadLibrary(".libs/libexample.so")
example.its_an_example.restype = c_wchar_p
example.its_an_example.argtypes = (c_wchar_p, c_wchar_p, c_uint)
buf = create_unicode_buffer(19) # writable, unlike u"example".
buf[0] = u"\u0000"
a = u"あがぃいぅ ☃ "
b = u"個人 相命理 網上聯盟"
print example.its_an_example(buf, a, len(buf) - len(buf.value) - 1)
print example.its_an_example(buf, b, len(buf) - len(buf.value) - 1)
print buf.value # you may have to .encode("utf-8") before printing
sys.stdout.write(buf.value.encode("utf-8") + "\n")
</code></pre>
<p>示例c:</p>
^{pr2}$
<p>Makefile:(确保缩进是一个制表符,而不是空格):</p>
<pre><code>all:
libtool mode=compile gcc -g -O -c example.c
libtool mode=link gcc -g -O -o libexample.la example.lo \
-rpath /usr/local/lib
</code></pre>