python ctypes传值的问题

使用ctypes调用dll时又遇到了一个问题,向ctypes调用的dll中的函数传递一个参数时参数值发送了变化。我是在Django中使用的这个dll,用shell直接使用传值没有任何问题。 问题代码:

1
2
3
4
5
6
7
8
#构造函数中载入dll并且初始化一个字符串保存路径
self.so = ctypes.CDLL("/home/pi/RaspCloud/bin/librcfile.so")
self.cur_path = path
......
fun = self.so.list_file
string = ctypes.create_string_buffer(MAXN)
fun(string, self.cur_path)
...

但是到了dll的函数中,路径就变成了"/",现在还没有搞明白原因,暂时的解决方案如下:

1
2
3
4
5
fun = self.so.list_file
string = ctypes.create_string_buffer(MAXN)
path = ctypes.create_string_buffer(MAXN)
path.value = self.cur_path
fun(string, path)

猜测原因可能是字符串的兼容,但是shell中却没有问题。。。难道是Django的原因吗。。。

ctypes多次载入dll

python中使用ctypes.CDLL可以载入dll文件,今天遇到一个问题就是如果先后载入同一个文件(例如有两个对象),实际上是共享了同一个dll对象。这在dll中存在参数并且两次载入进行了不同的操作时会造成问题。大概我的dll设计的不好,以后还是不要再dll中保存参数或者数据。

实验: 测试dll代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include 
int a=0;
void add(void)
{
a=2;
}
int tprint(void)
{
return a;
}
void set(int aa)
{
a=aa;
}

测试python代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import ctypes

class test:
def __init__(self,id):
self.so = ctypes.CDLL("dll.dll")
self.id = id

a = test('a')
b = test('b')

a.so.set(1)
b.so.set(2)
aa=a.so.tprint()
bb=b.so.tprint()
print a.id+':'
print aa
print b.id+':'
print bb

输出结果:

1
2
3
4
a:
2
b:
2