python调用dll动态库传入结构体作为参数

test.h中定义结构体

test.h

#include <stdio.h>
#include <wchar.h>


#define ARRAY_NUMBER 20
#define STR_LEN 20

typedef struct _tag_Struct
{
    int   number;
    char* pChar; //窄字符字符串
    char  str[STR_LEN]; //窄字符数组
    int   iArray[ARRAY_NUMBER];
}TMPSTRUCT;


extern "C"
{
__declspec(dllexport) int __cdecl test(wchar_t* a, int len);
__declspec(dllexport) TMPSTRUCT* __cdecl testStruct(TMPSTRUCT* a, int len);

};

test.cpp

#include "test.h"


__declspec(dllexport) int __cdecl test(wchar_t* a, int len)
{
    printf("get [%S] len %d\r\n", a, len);
   printf("hell test %s line %d \r\n", __FUNCTION__, __LINE__);


    return 169;
}


__declspec(dllexport) TMPSTRUCT* __cdecl testStruct(TMPSTRUCT* a, int len)
{
    int i = 0;


    printf("num %d str %s \r\n", a->number, a->pChar);

    for (i = 0; i < ARRAY_NUMBER; ++i)
    {
        printf("%d ", a->iArray[i]);
    }
    printf("\r\n");


    for (i = 0; i < STR_LEN; ++i)
    {
        printf("[%x %c] ", a->str[i], a->str[i]);
    }
    printf("\r\n");


    return a;
}

test.py

#coding=utf-8

from ctypes import *
import struct
import binascii

slen = 4
sBuf = 'aaaaaaaaaabbbbbbbbbbbbbb'
adll = cdll.LoadLibrary( 'pydll.dll')

##传入的参数是宽字符
adll.test(sBuf, slen);

ARRAY_NUMBER = 20;
STR_LEN = 20;
#define type
INTARRAY20 = c_int * ARRAY_NUMBER;
CHARARRAY20 = c_byte * STR_LEN;##不会给c_char*STR_LEN赋值,所以找了一个同样大小的类型
#define struct
class StructTest(Structure):
    _fields_ = [
        ("number", c_int),
        ("pChar", c_wchar_p),
        ("str", CHARARRAY20),
        ("iArray", INTARRAY20)
            ]


#load dll and get the function object
dll = cdll.LoadLibrary('pydll.dll');
testStruct = dll.testStruct;

objectStruct = StructTest();
objectStruct.number = 1989;
objectStruct.pChar = c_wchar_p('today is a very beautify day');

print ("before set value");
print ("get %d pChar %s"%(objectStruct.number, objectStruct.pChar));

print (sizeof(objectStruct.str));
print (len(objectStruct.str));##如果不是c_byte而是c_char这里的len的返回值是0,
print (len(objectStruct.iArray));

for i in range(0, len(objectStruct.str)):
    objectStruct.str[i] = 65 + i;

print ("str value done");

for i in range(0, len(objectStruct.iArray)):
    objectStruct.iArray[i] = i + 2;

#invoke api GetStructInfo
retStr = testStruct(pointer(objectStruct), 12);


#check result
print (objectStruct.number);
print (objectStruct.pChar);
for i,val in enumerate(objectStruct.iArray):
    print (val);
    
input("press enter to quit")  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值