title: Python ctypes - dll function accepting structures crashes
body: <p>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:</p>
  
  <pre><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);
  </code></pre>
  
  <hr>
  
  <pre><code>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
  </code></pre>