Python CTypes-DLL函数接受结构崩溃 [英] Python ctypes - dll function accepting structures crashes

查看:139
本文介绍了Python CTypes-DLL函数接受结构崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我必须在ms Windows XP下访问POS终端。我正在使用python 2.7。
我加载的DLL中执行付款的关键功能接受两个指向结构的指针,但返回1(通讯错误)但没有其他消息时会崩溃。
请注意,在调用支付功能时,并非POSData结构的所有元素都接收值。我尝试过的其他功能(GetVersion)确实有效。
这里的规范和我的代码:

I have to access a POS terminal under ms windows xp. I am using python 2.7. The crucial function in the DLL I load that does the payment accepts two pointer to structures, but it crashes returning 1 (Communication error) but without further messages. Please note that when the payment function is called, not all the elements of POSData structure receive a value. Other function I tried (GetVersion) does work. Here specifications and my code:

typedef struct
{
  char IPAddress[16]; //xxx.xxx.xxx.xxx
  int Port;
} TETHParameters;   
typedef struct
{
  char TerminalId[8+1];
  char AcquirerId[11+1];
  char TransactionType[3+1];
  char TransactionResult[2+1];
  char KODescription[24+1];
  char CardType[1+1];
  char STAN[6+1];
  char PAN[19+1];
  char AuthorizationCode[6+1];
  char OperationNumber[6+1];
  char DataTrs[7+1];
} TPOSData;

typedef struct
{
  char Amount[8+1];
  char ECRId[8+1];
  char PaymentType[1+1];
  char TerminalId[8+1];
} TECRData;

__declspec(dllexport) void IAE17_GetVersion(char *Version);
__declspec(dllexport) void IAE17_InitEth(TETHParameters *ETHParameters);

__declspec(dllexport) void IAE17_Free(void);

__declspec(dllexport) int IAE17_Payment(TECRData *ECRData, TPOSData *POSData);







from ctypes import *
#da python 3.x sara' configparser
import ConfigParser  
import logging
from time import  localtime,  strftime

    #STRUTTURE DATI
class TETHParameters(Structure):
    _fields_ =  [("IPAddress" , c_char_p), ("Port" , c_int )]


class TECRData(Structure):
    _fields_ = [("Amount" , c_char_p),
    ("ECRId", c_char_p),
    ("PaymentType", c_char_p),
    ("TerminalId", c_char_p),
    ("Contract", c_char_p),
    ("PreauthorizationCode", c_char_p),
    ("STAN", c_char_p),
    ("Ticket2Ecr", c_char_p)]


class TPOSData(Structure):
    _fields_ = [
    ("TerminalId" , c_char_p),
    ("AcquirerId" , c_char_p),
    ("TransactionType" , c_char_p),
    ("TransactionResult" , c_char_p),
    ("KODescription" , c_char_p),
    ("CardType" , c_char_p),
    ("STAN" , c_char_p),
    ("POSBalance" , c_char_p),
    ("BankBalance" , c_char_p),
    ("PAN" , c_char_p),
    ("AuthorizationCode" , c_char_p),
    ("OperationNumber" , c_char_p),
    ("AmountAuth" , c_char_p),
    ("PreauthorizationCode" , c_char_p),
    ("ActionCode" , c_char_p),
    ("DataTrs" , c_char_p),
    ("AmountEcho" , c_char_p),
    ("Ticket" , c_char_p)
    ] 

ECRData = TECRData( ECRId = c_char_p( '012345678' ), 
                    Amount  = c_char_p( '00000000')  , 
                    TerminalID = c_char_p( '01234567' ), 
                    PaymentType = c_char_p ("0")
                       )    


POSData = TPOSData( KODescription = c_char_p('                        '),
                            TerminalId = c_char_p('        '),  
                            AcquirerId = c_char_p('           '), 
                            TransactionType = c_char_p('   '), 
                            TransactionResult = c_char_p('   '),
                            CardType = c_char_p('  '), 
                            STAN = c_char_p('      '),
                            PAN = c_char_p('                   '), 
                            AuthorizationCode = c_char_p('      '),
                            OperationNumber = c_char_p('      '), 
                            DataTrs = c_char_p('       ')  
                            )   
ETHParameters = TETHParameters( IPAddress = c_char_p( '192.168.127.190' ) ,  Port = c_int(45119))                           
iae17 = windll.LoadLibrary('iae17')     
iae17.IAE17_InitEth( byref( ETHParameters) )   
result =  iae17.IAE17_Payment( byref(ECRData), byref(POSData))                      
print result


推荐答案

c_char_p 是C的 char * 的直接翻译。因此,在我看来,虽然您的C结构是

c_char_p is a direct translation of a C's char *. So, it seems to me that while your C structure is

typedef struct
{
  char TerminalId[8+1];
  char AcquirerId[11+1];
  char TransactionType[3+1];

&c

您在其中声称的对应对象ctypes等效于

the allegedly-corresponding one you're making in ctypes is, instead, equivalent to

typedef struct
{
  char* TerminalId;
  char* AcquirerId;
  char* TransactionType;

&c

当然,这是完全不同的事情。为什么要使用指针而不是ctypes的数组

which is of course a drastically different thing. Why are you using "pointers" instead of ctypes' arrays?

这篇关于Python CTypes-DLL函数接受结构崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆