Hallo,
ich bin verzweifelt am versuchen, eine DLL, die in C entwickelt wurde,
einzubinden. Der Hersteller der DLL hat noch keine VCL für das DLL entwickelt und auch kein Beispielprogramm (in Delphi). Der Support kann nur C und kein Delphi. In der Literatur habe ich auch nichts gefunden.
Es handelt sich um eine L_BARCODEREAD-funktion, die einen Barcode ausliest und diesen in einer Record-Struktur mit anderen Daten zurückgibt. Das es mehrere Barcodes sein können, handelt es sich um ein Array. Und da die DLL-Funktion den Speicher für dieses Array dynamisch selbst reserviert, erwartet die Funktion eine Adresse auf eine Pointer-Variable. Wie greife ich nun auf dieses Record-Array zu ?? Ich übergebe erst mal einen nicht-typisierten Pointer und versuche danach, darauf zuzgreifen. Der Pointer läßt sich aber nicht in einen Array-Pointer verwandeln.
Die Definition der Funktion lautet:
L_INT EXT_FUNCTION L_BarCodeRead(...,..., ppBarCodeData)
pBARCODEDATA L_FAR * ppBarCodeData; /* address of pointer to the BARCODE structure */
Die Definition der Barcodedata-Struktur lautet:
typedef struct tagBarCodeData
{
L_INT nGroup;
L_UINT32 ulType;
L_INT nUnits;
RECT rcBarLocation;
L_INT nSizeofBarCodeData;
L_CHAR L_FAR pszBarCodeData;
L_INT nIndexDuplicate;
L_INT nTotalCount;
L_INT nDupCount
} BARCODEDATA, L_FAR * pBARCODEDATA;
Folgendermaßen versuche ich darauf zuzugreifen:
Um das Ergebnis zu prüfen, frage ich den Returncode und die
ntotalcount-Variable = Anzahl gefundener Barcodes, ab.
Die ntotalcount-Variable liefert mir meist einen etwa 10stelligen Wert zurück, was mir sagt, daß auf einen undefinierten Speicherblock zugegriffen wird.
procedure lese_barcode();
var pdata: Pointer; // Pointer für BarcodeData
begin
/* Es sind hier alle Argumente angegeben. Problem könnte evtl auch
den anderen Argumenten liegen. Aber diese sind einfache Strukturen und deren Adressen */
ok := l_barcoderead(bitmap1,
@NULL, // Rechteck
BARCODE_1D_READ_ANYTYPE,// Suche alle EAN-Code
0, // Rectangle in Millimeter
0, //
0, // Anzahl Barcodes
@bc1d, // Struktur Barcode
@bcpdf, // Struktur PDF
@pData);
ShowMessage('read-ok= '+IntToStr(ok));
ShowMessage('Anzahl Barcodes: '+ IntToStr(Barcodedata(pdata^).nTotalCount) );
end;
Würde mich freuen, wenn mir jemand helfen könnte.
ich bin verzweifelt am versuchen, eine DLL, die in C entwickelt wurde,
einzubinden. Der Hersteller der DLL hat noch keine VCL für das DLL entwickelt und auch kein Beispielprogramm (in Delphi). Der Support kann nur C und kein Delphi. In der Literatur habe ich auch nichts gefunden.
Es handelt sich um eine L_BARCODEREAD-funktion, die einen Barcode ausliest und diesen in einer Record-Struktur mit anderen Daten zurückgibt. Das es mehrere Barcodes sein können, handelt es sich um ein Array. Und da die DLL-Funktion den Speicher für dieses Array dynamisch selbst reserviert, erwartet die Funktion eine Adresse auf eine Pointer-Variable. Wie greife ich nun auf dieses Record-Array zu ?? Ich übergebe erst mal einen nicht-typisierten Pointer und versuche danach, darauf zuzgreifen. Der Pointer läßt sich aber nicht in einen Array-Pointer verwandeln.
Die Definition der Funktion lautet:
L_INT EXT_FUNCTION L_BarCodeRead(...,..., ppBarCodeData)
pBARCODEDATA L_FAR * ppBarCodeData; /* address of pointer to the BARCODE structure */
Die Definition der Barcodedata-Struktur lautet:
typedef struct tagBarCodeData
{
L_INT nGroup;
L_UINT32 ulType;
L_INT nUnits;
RECT rcBarLocation;
L_INT nSizeofBarCodeData;
L_CHAR L_FAR pszBarCodeData;
L_INT nIndexDuplicate;
L_INT nTotalCount;
L_INT nDupCount
} BARCODEDATA, L_FAR * pBARCODEDATA;
Folgendermaßen versuche ich darauf zuzugreifen:
Um das Ergebnis zu prüfen, frage ich den Returncode und die
ntotalcount-Variable = Anzahl gefundener Barcodes, ab.
Die ntotalcount-Variable liefert mir meist einen etwa 10stelligen Wert zurück, was mir sagt, daß auf einen undefinierten Speicherblock zugegriffen wird.
procedure lese_barcode();
var pdata: Pointer; // Pointer für BarcodeData
begin
/* Es sind hier alle Argumente angegeben. Problem könnte evtl auch
den anderen Argumenten liegen. Aber diese sind einfache Strukturen und deren Adressen */
ok := l_barcoderead(bitmap1,
@NULL, // Rechteck
BARCODE_1D_READ_ANYTYPE,// Suche alle EAN-Code
0, // Rectangle in Millimeter
0, //
0, // Anzahl Barcodes
@bc1d, // Struktur Barcode
@bcpdf, // Struktur PDF
@pData);
ShowMessage('read-ok= '+IntToStr(ok));
ShowMessage('Anzahl Barcodes: '+ IntToStr(Barcodedata(pdata^).nTotalCount) );
end;
Würde mich freuen, wenn mir jemand helfen könnte.