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")  

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐