问题描述
我必须在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函数接受结构崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!