Embedding a 3rd party .dll

User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Embedding a 3rd party .dll

Post by Antonio Linares »

Gilbert,

Code: Select all

int pascal SepaTools_XMLGetData( char *Data, int *Size );

    HB_FUNC( SEPATOOLS_XMLGETDATA ) // pXml, @nSize --> nRetCode (?)
    {
        int iSize = hb_parni( 2 );

        hb_retni( SepaTools_XMLGetData( ( char * ) hb_parc( 1 ), &iSize ) );
        hb_storni( iSize, 2 );  
    }
 
regards, saludos

Antonio Linares
www.fivetechsoft.com
Jeanette Panitz
Posts: 10
Joined: Mon Oct 21, 2013 10:58 am
Location: Germany

Re: Embedding a 3rd party .dll

Post by Jeanette Panitz »

Hello,

i have still more problems with embedding functions of the .dll.

The function

Code: Select all

int pascal SepaTools_GetDTAProtokoll( XMLReadStruct24 *XMLReadStruct, int Fehler, int *First );
retrieves and stores a struct.

The struct

Code: Select all

typedef struct  
{  
    char  PmInfoId[35+1];       
    char  AusfDatum[8+1];        
    char  AuftragName[70+1];    
    char  AuftragBIC[11+1];     
    char  AuftragIBAN[35+1];    
    char  AuftragAbwName[70+1]; 
    char  AuftragCI[35+1];      
    char  EmpfName[70+1];       
    char  EmpfBIC[11+1];         
    char  EmpfIBAN[35+1];       
    char  EmpfAbwName[70+1];    
    char  Purpose[4+1];          
    char  Betrag[12+1];         
    char  EndToEndId[35+1];     
    char  MandatId[35+1];        
    char  MandatDatum[8+1];     
    char  SequenceType[4+1];    
    int   B2B;                   
    int   SammlerAnzahl;        
    char  SammlerSumme[12+1];   
    char  Zweck1[70+1];         
    char  Zweck2[70+1];         
    int   Hinweis[30];          
} XMLReadStruct24;
contains an array of integer "Hinweis". I don't how to handle it. I tried the following

Code: Select all

HB_FUNC( SEPATOOLS_GETDTAPROTOKOLL )
{
    int iSize = hb_parni( 3 );

    XMLReadStruct24 aStruct;
    strcpy( aStruct.PmInfoId, ( char * ) hb_parc( 1, 1 ) );
    strcpy( aStruct.AusfDatum, ( char * ) hb_parc( 1, 2 ) );
    strcpy( aStruct.AuftragName, ( char * ) hb_parc( 1, 3 ) );
    strcpy( aStruct.AuftragBIC, ( char * ) hb_parc( 1, 4 ) );
    strcpy( aStruct.AuftragIBAN, ( char * ) hb_parc( 1, 5 ) );
    strcpy( aStruct.AuftragAbwName, ( char * ) hb_parc( 1, 6 ) );
    strcpy( aStruct.AuftragCI, ( char * ) hb_parc( 1, 7 ) );
    strcpy( aStruct.EmpfName, ( char * ) hb_parc( 1, 8 ) );
    strcpy( aStruct.EmpfBIC, ( char * ) hb_parc( 1, 9 ) );
    strcpy( aStruct.EmpfIBAN, ( char * ) hb_parc( 1, 10 ) );
    strcpy( aStruct.EmpfAbwName, ( char * ) hb_parc( 1, 11 ) );
    strcpy( aStruct.Purpose, ( char * ) hb_parc( 1, 12 ) );
    strcpy( aStruct.Betrag, ( char * ) hb_parc( 1, 13 ) );
    strcpy( aStruct.EndToEndId, ( char * ) hb_parc( 1, 14 ) );
    strcpy( aStruct.MandatId, ( char * ) hb_parc( 1, 15 ) );
    strcpy( aStruct.MandatDatum, ( char * ) hb_parc( 1, 16 ) );
    strcpy( aStruct.SequenceType, ( char * ) hb_parc( 1, 17 ) );
    aStruct.B2B = hb_parni( 1, 18 );
    aStruct.SammlerAnzahl = hb_parni( 1, 19 );
    strcpy( aStruct.SammlerSumme, ( char * ) hb_parc( 1, 20 ) );
    strcpy( aStruct.Zweck1, ( char * ) hb_parc( 1, 21 ) );
    strcpy( aStruct.Zweck2, ( char * ) hb_parc( 1, 22 ) );
    aStruct.Hinweis = hb_parni( 1, 23 );
        
        
    SepaTools_GetDTAProtokoll( &aStruct, hb_parni( 2 ), &iSize );
    hb_storni( iSize, 3 );
        
    hb_reta( 23 );
    hb_storc( aStruct.PmInfoId, -1, 1 );
    hb_storc( aStruct.AusfDatum, -1, 2 );
    hb_storc( aStruct.AuftragName, -1, 3 );
    hb_storc( aStruct.AuftragBIC, -1, 4 );
    hb_storc( aStruct.AuftragIBAN, -1, 5 );
    hb_storc( aStruct.AuftragAbwName, -1, 6 );
    hb_storc( aStruct.AuftragCI, -1, 7 );
    hb_storc( aStruct.EmpfName, -1, 8 );
    hb_storc( aStruct.EmpfBIC, -1, 9 );
    hb_storc( aStruct.EmpfIBAN, -1, 10 );
    hb_storc( aStruct.EmpfAbwName, -1, 11 );
    hb_storc( aStruct.Purpose, -1, 12 );
    hb_storc( aStruct.Betrag, -1, 13 );
    hb_storc( aStruct.EndToEndId, -1, 14 );
    hb_storc( aStruct.MandatId, -1, 15 );
    hb_storc( aStruct.MandatDatum, -1, 16 );
    hb_storc( aStruct.SequenceType, -1, 17 );
    hb_storni( aStruct.B2B, -1, 18 );
    hb_storni( aStruct.SammlerAnzahl, -1, 19 );
    hb_storc( aStruct.SammlerSumme, -1, 20 );
    hb_storc( aStruct.Zweck1, -1, 21 );
    hb_storc( aStruct.Zweck2, -1, 22 );
    hb_storni( aStruct.Hinweis, -1, 23 );
}
but I get this error:

Error E2277 sepatool.prg 728: Lvalue required in function HB_FUN_SEPATOOLS_CONVERTCSVTOXML
Error E2342 sepatool.prg 754: Type mismatch in parameter 'iValue' (wanted 'int', got 'int *') in function HB_FUN_SEPATOOLS_CONVERTCSVTOXML

Regards,
Jeanette
With best regards,
Jeanette

http://www.ctosoftware.de/
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Embedding a 3rd party .dll

Post by Antonio Linares »

Jeanette,

You have posted the source code of function SEPATOOLS_GETDTAPROTOKOLL() but the errors that you get are from another function:
Error E2277 sepatool.prg 728: Lvalue required in function HB_FUN_SEPATOOLS_CONVERTCSVTOXML
Error E2342 sepatool.prg 754: Type mismatch in parameter 'iValue' (wanted 'int', got 'int *') in function HB_FUN_SEPATOOLS_CONVERTCSVTOXML
Please post the code for function SEPATOOLS_CONVERTCSVTOXML(), thanks
regards, saludos

Antonio Linares
www.fivetechsoft.com
Jeanette Panitz
Posts: 10
Joined: Mon Oct 21, 2013 10:58 am
Location: Germany

Re: Embedding a 3rd party .dll

Post by Jeanette Panitz »

yes, the same error occurs while compiling function HB_FUN_SEPATOOLS_CONVERTCSVTOXML.

But now the right errors

Code: Select all

Error E2277 SepaGetDTAProtocol.prg 101: Lvalue required in function HB_FUN_SEPATOOLS_GETDTAPROTOKOLL
Error E2342 SepaGetDTAProtocol.prg 132: Type mismatch in parameter 'iValue' (wanted 'int', got 'int *') in function HB_FUN_SEPATOOLS_GETDTAPROTOKOLL
With best regards,
Jeanette

http://www.ctosoftware.de/
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Embedding a 3rd party .dll

Post by Antonio Linares »

Jeanette,

What source code do you have in SepaGetDTAProtocol.prg in lines 101 and 132 ?

I can't know it from your posted code
regards, saludos

Antonio Linares
www.fivetechsoft.com
Jeanette Panitz
Posts: 10
Joined: Mon Oct 21, 2013 10:58 am
Location: Germany

Re: Embedding a 3rd party .dll

Post by Jeanette Panitz »

Antonio,

the sourcecode in line 101 and 132 should retrieve and store the array of integer "Hinweis".

line 101: aStruct.Hinweis = hb_parni( 1, 23 );
line 132: hb_storni( aStruct.Hinweis, -1, 23 );
With best regards,
Jeanette

http://www.ctosoftware.de/
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Embedding a 3rd party .dll

Post by Antonio Linares »

Jeanette,

Hinweis seems to be an array of ints;

int Hinweis[30];

not sure if you have to fill there several values (please review your docs about it) but if you want to fill just the first element of the array then do:

aStruct.Hinweis[ 0 ] = hb_parni( 1, 23 );

hb_storni( aStruct.Hinweis[ 0 ], -1, 23 );

not sure why you have 30 ints array there. Please check your docs about it.
regards, saludos

Antonio Linares
www.fivetechsoft.com
Jeanette Panitz
Posts: 10
Joined: Mon Oct 21, 2013 10:58 am
Location: Germany

Re: Embedding a 3rd party .dll

Post by Jeanette Panitz »

Antonio,

for only one value your solution works fine. Thank you. But I have to fill the array with all 30 values.
Now I tried to use a for loop to retrieve 30 values

Code: Select all

int k, l;
for ( k = 0; k < 30; k++ ) {
    l = k+1;
    aStruct.Hinweis[k] = hb_parni( 1, 23, l );
} 
 
Compiling and linking are successful but the element "Hinweis" is after looping still empty.
Last edited by Jeanette Panitz on Thu Oct 24, 2013 10:33 am, edited 1 time in total.
With best regards,
Jeanette

http://www.ctosoftware.de/
User avatar
mgsoft
Posts: 398
Joined: Mon Aug 17, 2009 12:18 pm
Location: España

Re: Embedding a 3rd party .dll

Post by mgsoft »

Hello,

Can you please post the full code?.

Thanks.
Saludos,

Eduardo
Jeanette Panitz
Posts: 10
Joined: Mon Oct 21, 2013 10:58 am
Location: Germany

Re: Embedding a 3rd party .dll

Post by Jeanette Panitz »

Hello Eduardo,

it's the same sourcecode like in my earlier post (Wed Oct 23, 2013 8:24 am).
I changed only line 101, so it looks now like that:

Code: Select all

typedef struct  
{  
       // ...        
       int   Hinweis[30];          
} XMLReadStruct24;

HB_FUNC( SEPATOOLS_GETDTAPROTOKOLL )
{
        int iSize = hb_parni( 3 );
        XMLReadStruct24 aStruct;
        int k, l;
    
        // ...    
        for ( k = 0; k < 30; k++ ) {
            l = k+1;
            aStruct.Hinweis[k] = hb_parni( 1, 23, l );
         }        
        
        SepaTools_GetDTAProtokoll( &aStruct, hb_parni( 2 ), &iSize );
        hb_storni( iSize, 3 );
        
        hb_reta( 23 );
        // ..
        hb_storni( aStruct.Hinweis, -1, 23 );
}
With best regards,
Jeanette

http://www.ctosoftware.de/
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Embedding a 3rd party .dll

Post by Antonio Linares »

Jeanette,

You are supplying an array to the function, are the elements for the int array a subarray ?

I mean:

{ first element, second element, ... { array for ints }, more elements... }
regards, saludos

Antonio Linares
www.fivetechsoft.com
Jeanette Panitz
Posts: 10
Joined: Mon Oct 21, 2013 10:58 am
Location: Germany

Re: Embedding a 3rd party .dll

Post by Jeanette Panitz »

Antonio,

it's easier to explain it on another function, which also contains a struct with an array of integer-element ( int CSVFeld[30]; )

Code: Select all

#include "Fivewin.ch" 
function main()
    local aConvertCSV2XML
    
    msgInfo(SEPATOOLS_INIT( "", "", "c:\temp", "", 0 ))
    
    aConvertCSV2XML := SEPATOOLS_CONVERTCSVTOXML({ "C:\Users\panitz\Documents\Mappe1.csv", "C:\Temp\XML\XML1.xml", "27092014",; 
             "", 0, 0, "TomSchmidt", "", "", "", "", "", "", "", "", 123,;
             {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0},;
             ";", "", "", "", ""})
    msgInfo( aConvertCSV2XML )
    
return nil


#pragma begindump
#include <hbapi.h>
#include <windows.h> 

    // INIT-Function
    int pascal SepaTools_Init(const char *DataPath, const char *TempPath, const char *UserPath, const char *Lizenz, int Netz);

    HB_FUNC (SEPATOOLS_INIT)
    {
        hb_retni( SepaTools_Init( hb_parc( 1 ), hb_parc( 2 ), hb_parc( 3 ), hb_parc( 4 ), hb_parni( 5 ) ) );
    }
    
    // CONVERTCSVTOXML - Function

    typedef struct 
    {  
        char  InputFile[255+1];     
        char  OutputFile[255+1];    
        char  AusfDatum[8+1];       
        char  Kennung[10+1];        
        int   Lastschrift;         
        int   B2B;                     
        char  Einreicher[70+1];     
        char  AuftragName[70+1];    
        char  AuftragBLZ[8+1];      
        char  AuftragKonto[11+1];   
        char  AuftragBIC[11+1];     
        char  AuftragIBAN[35+1];    
        char  CI[35+1];             
        char  Mandat[35+1];         
        char  MandatDat[8+1];       
        int   MandatStart;         
        int   CSVFeld[30];         
        char  Trennzeichen[1+1];    
        char  Grenze[1+1];           
        char  Tausend[1+1];         
        char  Komma[1+1];           
        char  Reserve[200];         
    } CSVConvertStruct30;
        
    int pascal SepaTools_ConvertCSVtoXML( const CSVConvertStruct30 *CSVConvert );
    
    HB_FUNC( SEPATOOLS_CONVERTCSVTOXML )
    {       
        int k, l;
        CSVConvertStruct30 aStruct;
                
        strcpy( aStruct.InputFile, ( char * ) hb_parc( 1, 1 ) );
        strcpy( aStruct.OutputFile, ( char * ) hb_parc( 1, 2 ) );
        strcpy( aStruct.AusfDatum, ( char * ) hb_parc( 1, 3 ) );
        strcpy( aStruct.Kennung, ( char * ) hb_parc( 1, 4 ) );
        aStruct.Lastschrift = hb_parni( 1, 5 );
        aStruct.B2B = hb_parni( 1, 6 );
        strcpy( aStruct.Einreicher, ( char * ) hb_parc( 1, 7 ) );
        strcpy( aStruct.AuftragName, ( char * ) hb_parc( 1, 8 ) );
        strcpy( aStruct.AuftragBLZ, ( char * ) hb_parc( 1, 9 ) );
        strcpy( aStruct.AuftragKonto, ( char * ) hb_parc( 1, 10 ) );
        strcpy( aStruct.AuftragBIC, ( char * ) hb_parc( 1, 11 ) );
        strcpy( aStruct.AuftragIBAN, ( char * ) hb_parc( 1, 12 ) );
        strcpy( aStruct.CI, ( char * ) hb_parc( 1, 13 ) );
        strcpy( aStruct.Mandat, ( char * ) hb_parc( 1, 14 ) );
        strcpy( aStruct.MandatDat, ( char * ) hb_parc( 1, 15 ) );
        aStruct.MandatStart = hb_parni( 1, 16 );

        for ( k = 0; k < 30; k++ ) {
            l = k+1;
            aStruct.CSVFeld[k] = hb_parni( 1, 17, l );
        }

        strcpy( aStruct.Trennzeichen, ( char * ) hb_parc( 1, 18 ) );
        strcpy( aStruct.Grenze, ( char * ) hb_parc( 1, 19 ) );
        strcpy( aStruct.Tausend, ( char * ) hb_parc( 1, 20 ) );
        strcpy( aStruct.Komma, ( char * ) hb_parc( 1, 21 ) );
        strcpy( aStruct.Reserve, ( char * ) hb_parc( 1, 22 ) );
        
        hb_retni( SepaTools_ConvertCSVtoXML( &aStruct ) );
    }

#pragma enddump 
 
With best regards,
Jeanette

http://www.ctosoftware.de/
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Embedding a 3rd party .dll

Post by Antonio Linares »

Jeanette,

Are you using xHarbour ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
Jeanette Panitz
Posts: 10
Joined: Mon Oct 21, 2013 10:58 am
Location: Germany

Re: Embedding a 3rd party .dll

Post by Jeanette Panitz »

Antonio,

yes, like Gilbert I'm using xHarbour.
With best regards,
Jeanette

http://www.ctosoftware.de/
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Embedding a 3rd party .dll

Post by Antonio Linares »

Jeanette,

Please try it this way:

Code: Select all

PHB_ITEM pArray = hb_param( 17, HB_IT_ARRAY );

   for( k = 0; k < 30; k++ ) 
   {
      aStruct.CSVFeld[ k ] = hb_arrayGetNI( pArray, k + 1 );
   }
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply