Hallo zusammen,
ich kämpfe im Moment mit einer C++-DLL für die Abfrage einer Kamera, die ich aus Delphi heraus aufrufen möchte. Prinzipiell funktioniert alles, nur bekomme ich als Bilddaten immer nur die ersten 5 Zeichen. Eine Beispiel-EXE, die die gleiche DLL verwendet, kann jedoch problemlos das gesamte Bild anzeigen.
Hier zunächst einmal ein Auszug aus der C++-Header-Datei sowie ein kleines Beispiel in C++:
Ich habe das ganze wie folgt in Delphi gelöst (dynamische Einbindung der Funktionen lasse ich hier jetzt weg und schreibe nur die entsprechende Funktionsdefinition):
Da ich das Bild nicht in eine Datei speichern, sondern anders weiter verarbeiten möchte, entfällt hier bei mir der Teil mit dem Speichern in einer Datei.
Aber wie bereits geschrieben, O2DResult.image enthält nach dem Funktionsaufruf zum Abrufen des Bildes nur ganze fünf Zeichen - diese sind aber zumindest korrekt
Was mache ich falsch??
Hoffe, mir kann hier geholfen werden...
Gruß,
Matu
ich kämpfe im Moment mit einer C++-DLL für die Abfrage einer Kamera, die ich aus Delphi heraus aufrufen möchte. Prinzipiell funktioniert alles, nur bekomme ich als Bilddaten immer nur die ersten 5 Zeichen. Eine Beispiel-EXE, die die gleiche DLL verwendet, kann jedoch problemlos das gesamte Bild anzeigen.
Hier zunächst einmal ein Auszug aus der C++-Header-Datei sowie ein kleines Beispiel in C++:
Code:
#define DUALISPIDK_API __declspec(dllimport) typedef struct t_O2dResultObject { int iModelId; int iPositionX; int iPositionY; float fRotation; float fMatchQuality; } T_O2DRESULTOBJECT, *PT_O2DRESULTOBJECT; typedef struct t_O2dResult { T_BOOL bOverallPass; float fOverallMatchQuality; int iNrOfObjectsFound; int iObjectsFoundListSize; PT_O2DRESULTOBJECT objectsFoundList; int iImageSize; char *image; } T_O2DRESULT, *PT_O2DRESULT; DUALISPIDK_API int O2dTriggerWithResult (unsigned int iConnectionID, PT_O2DRESULT decodingResult); ------------------------------------------------------------ void demo_O2dTriggerWithResults(unsigned int con_id, const char *filename) { #define maxNumberOfObjects 5 #define maxImageSize 308278 /* Number of bytes of a Windows Bitmap with 640x 480 pixel, 8 bit */ int i, retval; FILE *fp; T_O2DRESULT result; T_O2DRESULTOBJECT detail[maxNumberOfObjects]; result.iObjectsFoundListSize = maxNumberOfObjects; result.objectsFoundList = detail; result.image = (char *)malloc(maxImageSize); result.iImageSize = maxImageSize; retval = O2dTriggerWithResult(con_id, &result); log_retval("O2dTriggerWithResult() returns %d\n", retval); printf("bOverallPass = %d\n", result.bOverallPass); printf("fOverallMatchQuality = %6.2f\n", result.fOverallMatchQuality); printf("iNrOfObjectsFound = %d\n", result.iNrOfObjectsFound); printf("iObjectsFoundListSize = %d\n", result.iObjectsFoundListSize); printf("iImageSize = %d\n", result.iImageSize); for (i = 0; i < result.iObjectsFoundListSize; i++) { printf("Object #%d, iModelId = %d\n", i, detail[i].iModelId); printf("Object #%d, iPositionX = %d\n", i, detail[i].iPositionX); printf("Object #%d, iPositionY = %d\n", i, detail[i].iPositionY); printf("Object #%d, fRotation = %6.2f\n", i, detail[i].fRotation); printf("Object #%d, fMatchQuality = %6.2f\n", i, detail[i].fMatchQuality); } fp = fopen(filename, "wb"); fwrite(result.image, 1, result.iImageSize, fp); fclose(fp); free(result.image); }
Code:
type t_O2dResultObject = record iModelId: Integer; iPositionX: Integer; iPositionY: Integer; fRotation: Single; fMatchQuality: Single; end; Pt_O2dResultObject = ^t_O2dResultObject; t_O2dResult = record bOverallPass: T_BOOL; fOverallMatchQuality: Single; iNrOfObjectsFound: Integer; iObjectsFoundListSize: Integer; objectsFoundList: PT_O2DRESULTOBJECT; iImageSize: Integer; image: PChar; end; var O2dGetLastResult: function(iConnectionID: DWord; var decodingResult: T_O2DRESULT): integer cdecl; ------------------------------------------------------------ procedure TForm1.Demo; var res: Integer; O2dResult: T_O2dResult; O2DRESULTOBJECT: Pt_O2DRESULTOBJECT; begin GetMem(O2DResultObject,SizeOf(T_O2DResultObject)); O2DResult.iObjectsFoundListSize := 1; O2DResult.objectsFoundList := O2DResultObject; O2DResult.iImageSize := 308278; GetMem(O2DResult.image,SizeOf(Char)*308278); res := O2DTriggerWithResult(Cam1_ConID,O2DResult);
Aber wie bereits geschrieben, O2DResult.image enthält nach dem Funktionsaufruf zum Abrufen des Bildes nur ganze fünf Zeichen - diese sind aber zumindest korrekt
Was mache ich falsch??
Hoffe, mir kann hier geholfen werden...
Gruß,
Matu
Comment