vs2010编写dll库供python使用

10 篇文章 0 订阅
7 篇文章 0 订阅

刚接触这个问题的时候在网上也是搜罗了一大堆,大多数做下来没有成功,原因未知,很可能是我的功底不够吧,这里记录一下我成功的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);

结果如下:(程序很简单这里不做太多的说明)

这里写图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值