Python ctypes in_dll字符串赋值

时间:2010-05-19 17:31:43

标签: python ctypes

我可以使用ctypes在DLL中使用一些帮助分配给全局C变量。

以下是我正在尝试的一个例子:

test.c包含以下内容

    #include <stdio.h>

    char name[60];

    void test(void) {
      printf("Name is %s\n", name);
    }

在Windows(cygwin)上,我按如下方式构建DLL(Test.dll):

gcc -g -c -Wall test.c
gcc -Wall -mrtd -mno-cygwin -shared -W1,--add-stdcall-alias -o Test.dll test.o

当尝试修改name变量然后使用ctypes接口调用C测试函数时,我得到以下内容......

>>> from ctypes import *
>>> dll = windll.Test
>>> dll
<WinDLL 'Test', handle ... at ...>
>>> f = c_char_p.in_dll(dll, 'name')
>>> f
c_char_p(None)
>>> f.value = 'foo'
>>> f
c_char_p('foo')
>>> dll.test()
Name is Name is 4∞┘☺
13

为什么测试功能会在这种情况下打印垃圾?

更新

我已经确认了Alex的回复。这是一个有效的例子:

>>> from ctypes import *
>>> dll = windll.Test
>>> dll
<WinDLL 'Test', handle ... at ...>
>>> f = c_char_p.in_dll(dll, 'name')
>>> f
c_char_p(None)
>>> libc = cdll.msvcrt
>>> libc
<CDLL 'msvcrt', handle ... at ...>
#note that pointer is required in the following strcpy
>>> libc.strcpy(pointer(f), c_char_p("foo"))
>>> dll.test()
Name is foo

1 个答案:

答案 0 :(得分:5)

name实际上并不是一个字符指针(它是一个数组,在访问时“衰减到”指针,但永远不能指定) 。您需要从C运行时库中调用strcpy函数,而不是分配给f.value