python ctypes调用dll的问题

IT小混混1 2011-06-11 12:43:46
python ctypes调用c的dll的函数之后,返回值是char*类型,应该如何获取?恳请高手帮忙解答!
...全文
1274 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
而获啊 2014-02-08
  • 打赏
  • 举报
回复
解决了应该把方法分享出来。可以帮助更多人。
hdzb001 2012-12-17
  • 打赏
  • 举报
回复
怎么解决的。
IT小混混1 2011-06-14
  • 打赏
  • 举报
回复
我的c程序是这样的:
#include "add.h"
#include <cstring>
#include <iostream>
char* foo()
{
return "hello";
}

头文件时这样的:
#ifndef __ADD_H__
#define __ADD_H__
#include <iostream>

extern "C" char* __declspec(dllexport)foo(void);

#endif

然后通过VC++6.0编译成add.dll动态库,

之后就是python调用的代码了:
import ctypes
dll = ctypes.CDLL("D:\\myplace\\add\\Debug\\add.dll")
dll.foo.restype = ctypes.c_char_p
p = dll.foo()
print p

路径什么的可以确定没有问题,运行程序之后就出现下面的异常:
Traceback (most recent call last):
File "D:\workspace\NR8250\src\study\test2.py", line 3, in <module>
dll.foo.restype = ctypes.c_char_p
File "C:\Python26\lib\ctypes\__init__.py", line 366, in __getattr__
func = self.__getitem__(name)
File "C:\Python26\lib\ctypes\__init__.py", line 371, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'foo' not found


angel_su 2011-06-14
  • 打赏
  • 举报
回复
返回char*没啥特殊的,估计你造dll有问题,可以的话摆出来看看吧...
IT小混混1 2011-06-14
  • 打赏
  • 举报
回复
但是我的dll中明明有的啊,如果我把C程序中的返回值改成char、bool、int、double都可以的啊,不信你可以试下的,这个我尝试好几天了,都没有解决,在网上找也没找到类似的例子,所以才来这里发帖的,实在是不知道改怎么处理了
angel_su 2011-06-14
  • 打赏
  • 举报
回复
说你的dll里没有foo,这个又得问你自己啦...
IT小混混1 2011-06-14
  • 打赏
  • 举报
回复
已经解决了,多谢了
angel_su 2011-06-14
  • 打赏
  • 举报
回复
上面简化表示了,代码里前面别忘了extern "C"...
angel_su 2011-06-14
  • 打赏
  • 举报
回复
extern "C" char* __declspec(dllexport)foo(void);貌似vc里不该用这个* __declspec语法,改下面一种再试试:

__declspec(dllexport) const char *foo(void);
const char __declspec(dllexport) *foo(void);
LPCSTR __declspec(dllexport) foo(void);
IT小混混1 2011-06-13
  • 打赏
  • 举报
回复
那我应该如何才能拿到字符串“hello”呢?请明示
IT小混混1 2011-06-13
  • 打赏
  • 举报
回复
不好意思,我刚把这个方法打错了,改了之后报错还是如下:
Traceback (most recent call last):
File "D:\workspace\NR8250\src\study\test2.py", line 3, in <module>
dll.foo.restype = ctypes.c_char_p
File "C:\Python26\lib\ctypes\__init__.py", line 366, in __getattr__
func = self.__getitem__(name)
File "C:\Python26\lib\ctypes\__init__.py", line 371, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'foo' not found
真不知道是什么原因?再次跪求高手解决
angel_su 2011-06-13
  • 打赏
  • 举报
回复
不晓得为啥你非要说dll.foo.restype就是在第七行,解释器明明说是dll.test.restype,难道会篡改你的脚本吗?你的dll里有foo没有test自然是出差错
IT小混混1 2011-06-13
  • 打赏
  • 举报
回复
我中间有注释的地方,dll.foo.restype就是在第七行,不知道为什么找不到方法,我之前试过了char、bool、int、double类型的都可以返回,但是就是char*的类型返回有问题,不知道怎么回事,能给我举个简单的例子吗?
angel_su 2011-06-13
  • 打赏
  • 举报
回复
你说的dll.foo.restype在第三行,但明明报错是说在第7行dll.test.restype = ctypes.c_char_p找不到test函数,咋回事问你自己吧...
IT小混混1 2011-06-13
  • 打赏
  • 举报
回复
我的c语言程序是这样的,然后编译成动态库dll文件:
char *foo()
{
return "hello";
}

之后我的python程序来调用动态库dll文件的foo方法,想得到返回的字符串“hello”:
import ctypes
dll = ctypes.CDLL("D:\\myplace\\add\\Debug\\add.dll")
dll.foo.restype = ctypes.c_char_p
p = dll.foo()
print p

但是我python中的程序调用c程序中的foo方法没有返回字符串"hello",而是出错了,报错如下:
Traceback (most recent call last):
File "D:\workspace\testdll\src\testdll\test.py", line 7, in <module>
dll.test.restype = ctypes.c_char_p
File "C:\Python26\lib\ctypes\__init__.py", line 366, in __getattr__
func = self.__getitem__(name)
File "C:\Python26\lib\ctypes\__init__.py", line 371, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'test' not found
跪求高手帮忙,不知道哪里出错了?
iambic 2011-06-13
  • 打赏
  • 举报
回复
你自己拿到的是啥?
iambic 2011-06-12
  • 打赏
  • 举报
回复
谁知道你程序里拿到的是啥。
IT小混混1 2011-06-12
  • 打赏
  • 举报
回复
我的c语言程序是这样的:
char *foo()
{
return "hello";
}

我的python调用的程序是:
import ctypes
dll = ctypes.CDLL("D:\\myplace\\add\\Debug\\add.dll")
dll.foo.restype = ctypes.c_char_p
p = dll.foo()
print p

为什么我python中的程序调用c程序中的foo方法不能返回字符串"hello"呢?跪求高手帮忙
angel_su 2011-06-11
  • 打赏
  • 举报
回复
看看手册呗,默认返回整型,你可以事先设定好函数的restype属性或者照上楼说的...
iambic 2011-06-11
  • 打赏
  • 举报
回复
ctypes.string_at

37,722

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧