Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [DELPHI] Conversione API da C a delphi

    Mi devo interfacciare ad una DLL per comandare un lettore di codici a barre.
    La documentazione delle API è in C.

    La funzione per leggere il codice a barre in C è dichiarata nel seguente modo :
    codice:
    HCEXPORTC HCStatus HCAPI BC_GetBarcode  	(  	HCHandle   	 readerHandle,
    		HCHandle  	barcodeHandle,
    		WCHAR *  	barcode,
    		DWORD *  	sizeWChar	 
    	)
    QUESTO è l'esempio originale

    codice:
    returnStatus = BC_GetBarcode(readerHandle, HC_HANDLE_CURRENTITEM, NULL, &barcodeSize);
                // Allocate the barcode buffer
            barcode = new WCHAR[barcodeSize];
                // Get the barcode data 
            returnStatus = BC_GetBarcode(readerHandle, HC_HANDLE_CURRENTITEM, barcode, &barcodeSize);
                // Do something with the barcode data
    Il primo parametro è rappresenta l'handle del lettore, il secondo mi dice quale codice leggere.
    Nel terzo parametro io dovrei trovare il codice letto, l'ultimo parametro è la lunghezza del codice.

    Io ho tradotto nella seguente maniera : "

    codice:
    BC_GetBarcode : Function (BarcodeReader : Pointer; BarcordeHandle : Longint; var Barcode : pWideString; var Size : Longint):LongInt; StdCall;
    "
    
    
    var
      PW : pWideString;
      WS : WideString;
    
      .
      .
      .
                  // prima lettura x avere la lunghezza avvalorata 
                  Stato := BC_GetBarcode(fBarcodeReader,HC_HANDLE_CURRENTITEM,PW,bCodeSize);
    
                  //seconda lettura x leggere il barcode
                  Stato := BC_GetBarcode(fBarcodeReader,HC_HANDLE_CURRENTITEM,PW,bCodeSize);
                  WS := ^PW;
    
    
      .
      .
      .
    La funzione va a buon fine, però quando provo ad utilizzare il valore di Barcode(WS) mi da sempre una serie di caratteri "strani".

    Come va tradotta correttamente questa dichiarazione? oppure il problema è nella lettura del valore ?

    Attendo fiducioso, Grazie 1000

    Nicola

  2. #2
    Risolto :
    Anzichè un pWidestring ho messo un array[1..256] of WChar, xchè ho scoperto che non si trattava di un puntatore ma di un buffer vero e proprio.

    Purtroppo, visto che in delphi non posso mettere parametri dinamici , ho dovuto mettere un array con lunghezza fissa piuttosto grande!

    Ciao

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Originariamente inviato da Nikk11
    Anzichè un pWidestring ho messo un array[1..256] of WChar, xchè ho scoperto che non si trattava di un puntatore ma di un buffer vero e proprio.
    Si trattava di un puntatore, probabilmente, ma questo puntatore deve puntare ad un buffer, come hai giustamente indicato.

    Originariamente inviato da Nikk11
    Purtroppo, visto che in delphi non posso mettere parametri dinamici , ho dovuto mettere un array con lunghezza fissa piuttosto grande!
    Mi risulta che l'approccio sia lo stesso anche in altri linguaggi, poiché il buffer deve essere creato da chi invoca la funzione che lo utilizza.

    La documentazione della libreria dovrebbe chiederti o indicarti come specificare la lunghezza massima del buffer per un giusto dimensionamento.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  4. #4
    Originariamente inviato da alka

    Mi risulta che l'approccio sia lo stesso anche in altri linguaggi, poiché il buffer deve essere creato da chi invoca la funzione che lo utilizza.

    Ciao!
    Hai Ragione : ho scritto una stupidaggine.

    Se io dichiaro la funzione così il compilatore mi da errore

    codice:
    BC_GetBarcode : Function (BarcodeReader : Pointer; BarcordeHandle : Longint; var Barcode : array of wchar  ; var Size : Longint):LongInt; StdCall;

    se invece faccio semplicemente così :

    codice:
    TBarcodeDataArray = Array of wchar;
    
    BC_GetBarcode : Function (BarcodeReader : Pointer; BarcordeHandle : Longint; var Barcode : TBarcodeDataArray; var Size : Longint):LongInt; StdCall;
    e a runtime setto la lunghezza con SetLength tutto funziona correttamente.

    Grazie Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.