AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi C++ DLL - Headerkovertierung und Funktionsaufruf
Thema durchsuchen
Ansicht
Themen-Optionen

C++ DLL - Headerkovertierung und Funktionsaufruf

Ein Thema von MatuAC · begonnen am 6. Jun 2011 · letzter Beitrag vom 7. Jun 2011
 
MatuAC

Registriert seit: 26. Sep 2007
5 Beiträge
 
#1

C++ DLL - Headerkovertierung und Funktionsaufruf

  Alt 6. Jun 2011, 15:04
Delphi-Version: 7
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++:
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);
}
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):
Delphi-Quellcode:
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);
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
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz