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