刚接触这个问题的时候在网上也是搜罗了一大堆,大多数做下来没有成功,原因未知,很可能是我的功底不够吧,这里记录一下我成功的demo,希望能版主其他人。
首先就是使用vs2010创建一个dll库(空项目)的工程,
添加源文件(如:hello.cpp)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define EXPORT_PKG_DLL
#include "hello.h"
PKG_API int GetStructInfo(struct StructInfo* pStruct)
{
pStruct->soh = 0x55;
pStruct->id = 0x1234;
pStruct->cmd = 0x56;
pStruct->len = 0x9;
strncpy(pStruct->data,'hello',5);
pStruct->crc = 0x90f2;
return TURE;
}
定义hello.h文件:
#ifdef EXPORT_PKG_DLL
#define PKG_API __declspec(dllexport)
#else
#define PKG_API __declspec(dllimport)
#endif
#define PKG_SOH 0x55
#define TURE 0
#define FALSE 1
#define DATA_LEN 256
struct StructInfo
{
int soh;
int id;
int cmd;
int len;
char data[DATA_LEN];
int crc;
};
extern "C"
{
PKG_API int GetStructInfo(const char *src,struct StructInfo* pStruct);
}
然后编译生成*.dll文件,(rg:pycall.dll)
接下来就是编写py程序:
from ctypes import *
DEST_LEN = 270
DATA_LEN = 256
#define type
DESTARRAY270 = c_char * DEST_LEN;#int []
CHARARRAY256 = c_char * DATA_LEN;#char []
#define struct c_char_p: * c_int :int
class StructPkg(Structure):
_fields_ = [
("soh", c_int),
("id", c_int),
("cmd", c_int),
("len", c_int),
("data", CHARARRAY256),
("crc", c_int),
]
dll = cdll.LoadLibrary('pycall.dll');
GetStructInfo = dll.GetStructInfo;
#set the return type
GetStructInfo.restype = c_int;
#set the argtypes
GetStructInfo.argtypes = [c_char_p,POINTER(StructPkg)];
objectStruct = StructPkg()
#invoke api GetStructInfo
test = bytes([85,1,2,1,12])
teststr = 'get data cmd'
testcrc = bytes([0x71,0x79])
ll = test+teststr.encode('utf-8')+testcrc
retStr = GetStructInfo(ll,byref(objectStruct));
print(objectStruct)
# #check result
print ("soh: ", objectStruct.soh)
print ("id: ", objectStruct.id)
print ("cmd: ", objectStruct.cmd)
print ("len: ", objectStruct.len)
print ("data: ", objectStruct.data)
print ("crc: ", objectStruct.crc)
print (retStr);
结果如下:(程序很简单这里不做太多的说明)