前面我们生成了dll文件,接着我们需要来用python调用我们的dll文件了,前面我用string带入参数总是出现错误,首先是python找不到fanuc函数(这是我在dll里面定义的函数名称)。
之前添加一个头文件进行宏定义,这里我新增了一个fanuc.h头文件。
#include <string>
using namespace std;
//定义宏
#ifdef DL1_API
#else
#define DL1_API extern "C" _declspec(dllimport)
#endif
DL1_API string transmission(string ip,string path);
执行之后又报错:OSError: exception: access violation writing 0x0055002F,找半天也没找到有关的信息,
翻译:OSError:异常:访问违规写入0x0055002F
接着报错:指定的 C 链接,但返回了与 C 不兼容
警告 1 warning C4190: “transmission”有指定的 C 链接,但返回了与 C 不兼容的 UDT“std::basic_string<_Elem,_Traits,_Alloc>” e:\projects\fanucnc\fanucnc\fanuc.h 9 1 FanucNC
这次没报错,也没有返回任何信息,头疼........
在函数中加句输出语句:printf(" i come here");,但是其他返回信息却没有...
前面提示 :警告 1 warning C4190: “fanuc”有指定的 C 链接,但返回了与 C 不兼容的 ,但改成char*就可以了,说明c返回值 不兼容string,所以在传入值中用string应该也有问题
char* fanuc(char* ipaddr,char* pathName);
{
//内容省略****
}
那么新的问题也来了,c++中接受的是char*类型,那么意味着python传进来的值也应该是相同的类型,否知一样无法识别
from ctypes import *
dll=CDLL('FanucNC.dll')
ip='10.143.60.136'
path='C:/Users/ICCN6079/Desktop/FanucNC/Debug/O0001.NC'
value=dll.fanuc(ip,path)
print(value)
这里我们把python也修改一下,将字符串进行转义,换成字节类型
from ctypes import *
dll=CDLL('FanucNC.dll')
ip=bytes('10.143.60.136',encoding='utf-8')
Path=bytes('C:/Users/ICCN6079/Desktop/FanucNC/Debug/O0001.NC',encoding='utf-8')
value=dll.fanuc(ip,Path)
print(value)
这样两边就对接好了,再次执行我们就可以获取到当前函数的返回值了。
现在还有个问题需要解决的就是,int类型返回正常,但是用char*作为返回类型的话收到的是地址符,并不是字符串,这样python这边不无法分辨接受到的信息了,求大神指点一二了。
首发百度经验 : C/C++实战004:python调用c++的dll文件
欢迎关注本人的公众号:编程手札,文章也会在公众号更新