Utilisation fonction DLL C++ dans Delphi ,Prob : types incompatibles [Résolu]

Signaler
Messages postés
5
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
25 juillet 2008
-
Messages postés
5
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
25 juillet 2008
-
Bonjour,
J'utilise les fonctions d'une dll écrit en C++ pour faire de l'acquisition vidéo
j'ai réussi à passer du C au delphi mais un problème subsiste lors de l'appelle d'une fonction
cette fonction sert à ajouter un texte sur la vidéo en cours de visualisation
en C++ le fonction est :
MID2250_API int SN_SetOverlayText( int idx, const POINT *pPos, const overlay_text_t *pOvlText, BOOL bEnable, BOOL bUpdate, int board);
que j'ai traduit en delphi :
function SN_SetOverlayText(idx :longint;position : tab2int;OvlText : overlay_text_t;bEnable : boolean;bUpdate : boolean;board :longint): longint; cdecl; external NomDLL;
AVEC
type
   tab2int = array[1..2] of integer;
   overlay_text_t = RECORD
                text : array[0..95] of char;
                fontidx: integer;
        reserved : array[0..27] of char;
                 END;
Ma procedurequi appelle la fonction est :
procedure TForm1.SetOverlayTextClick(Sender: TObject);
var
    position : tab2int;
    ovltext : overlay_text_t;
begin
    position[1]:=10;
    position[2]:=15;
    ovltext.text := 'montextesurlavideo';//cause du problème
    ovltext.fontidx := 2;
    ovltext.reserved :='reserved';
    SN_SetOverlayText(1, position, ovltext, TRUE, true, 0);
end;

le message d'erreur est :
le projet a provoqué une classe d'exception  EAccessViolation avec le message "violation access à l'adresse ... dans le module ..."
c'est après plusieurs test que je me suis rendu compte de la source du probblème :  ovltext.tex
si je mets dans ovltext.text    'montextesurlavideo'#0  ma fonction renvoi un chiffre (-8) disant que ca n'a pas marché
si je mets dans ovltext.text    #0  ma fonction renvoi un chiffre (0) disant que ca à marché
mais #0 n'affiche rien c'est un caractère de fin de ligne en C++
 j'ai essayé de mettre une variable de type array[0..95] of char dans ovltext.text
mais il me disait type incompatible sans préciser pourquoi
voilà pourquoi je suis la car ceux sont deux variables du même type mais incompatibles !!

Merci d'avance pour vos réponses

7 réponses

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
unit MID2250WRAP;

interface

uses Windows, SysUtils;

{ ... }

const
  OVLTEXT_SUCCESS        = 0; 
  OVLTEXT_FAILURE        = -1;
  OVLTEXT_OUTOFTEXTSPACE = -2;
 
  {$EXTERNALSYM MAX_OVLTEXT}
  MAX_OVLTEXT = 96;

type
  {$EXTERNALSYM overlay_text_t}
  overlay_text_t = record
    text     : array[0..MAX_OVLTEXT-1] of char;
    fontidx  : integer;
    reserved : array[0..27] of char;
  end; 
  TOverlayTextT = overlay_text_t;
  POverlayTextT = ^TOverlayTextT;

{ ... }

{$EXTERNALSYM SN_SetOverlayText}
function SN_SetOverlayText(idx: integer; const pPos: PPoint; const pOvlText: POverlayTextT;
bEnable, bUpdate: BOOL; Board: integer): integer; cdecl;

{$EXTERNALSYM SN_ClearOverlay}
function SN_ClearOverlay(board: integer): integer; cdecl;

implementation

const
  MID2250LIB = 'mid2250.dll';

{ ... }
 
function SN_SetOverlayText external MID2250LIB name 'SN_SetOverlayText';
function SN_ClearOverlay external MID2250LIB name 'SN_ClearOverlay';

{ ... }

end.








<hr size="2" width="100%" />
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
var Rest : integer;
    OvlText: TOverlayTextT;
    Pos : TPoint;

{ ... }

case SN_SetOverlayText(0, @Pos, @OvlText, true, true, 0) of
  OVLTEXT_SUCCESS : ...
  OVLTEXT_FAILURE : ...
  OVLTEXT_OUTOFTEXTSPACE : ...
end;

{ ... }




<hr size="2" width="100%" />
Messages postés
5
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
25 juillet 2008

voilà ce que j'ai fait pour mmodifier dynamiquement le texte

procedure TReglageZoom.SetOverlayTextClick(Sender: TObject);
var
Rest : integer;
OvlText: TOverlayTextT;
Pos : TPoint;
i,l :integer;
t : string;
begin
Pos.X:=10;
Pos.Y:=15;
SetOverlayTextEdit.MaxLength := MAX_OVLTEXT;
t := SetOverlayTextEdit.Text;
l := length(t);

for i:=1 to l do
OvlText.text[i-1]:=t[i];

OvlText.text[l]:=chr(0);
OvlText.fontidx := 2;
OvlText.reserved :='reserved';
SN_SetOverlayText(0, @Pos, @OvlText, true, true, 0);

end;

comme ca j'écris un texte dans un edit (SetOverlayTextEdit)  et je l'affiche sur la vidéo (SN_SetOverlayText)
avec un timer on peu afficher la date et l'heure toutes les deux secondes par exemple
Messages postés
5
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
25 juillet 2008

Merci beaucoup pour cette réponse rapide
je me sentais un peu seul au monde avec cette DLL

voila mon code :

uses
Windows, SysUtils;
const
NomDLL = 'mid2250.dll';
(...)
  OVLTEXT_SUCCESS        = 0;
  OVLTEXT_FAILURE        = -1;
  OVLTEXT_OUTOFTEXTSPACE = -2;

  {$EXTERNALSYM MAX_OVLTEXT}
  MAX_OVLTEXT = 96;

(...)

type
  {$EXTERNALSYM overlay_text_t}
  overlay_text_t = record
    text     : array[0..MAX_OVLTEXT-1] of char;
    fontidx  : integer;
    reserved : array[0..27] of char;
  end;
  TOverlayTextT = overlay_text_t;
  POverlayTextT = ^TOverlayTextT;

(...)

{$EXTERNALSYM SN_SetOverlayText}
function SN_SetOverlayText(idx: integer; const pPos: PPoint; const pOvlText: POverlayTextT;
bEnable, bUpdate: BOOL; Board: integer): integer; cdecl;external NomDLL name 'SN_SetOverlayText'
{$EXTERNALSYM SN_ClearOverlay}
function SN_ClearOverlay(board: integer): integer; cdecl;external NomDLL name 'SN_ClearOverlay'

procedure TForm1.SetOverlayTextClick(Sender: TObject);
var
Rest : integer;
OvlText: TOverlayTextT;
Pos : TPoint;
r :integer;

begin
Pos.X:=10;
Pos.Y:=15;
OvlText.text :='Montexteaffché';
OvlText.fontidx := 2;
OvlText.reserved :='reserved';
r:=SN_SetOverlayText(0, @Pos, @OvlText, true, true, 0);
SetOverlayTextEdit.Text := inttostr(r);
end;

procedure TForm1.ClearOverlayClick(Sender: TObject);
var
r :integer;
begin
r:=SN_ClearOverlay(0);
ClearOverlayEdit.Text := inttostr(r);
end;

la variable r affichée dans les edits sert à vérifier le bon fonctionnement des fonctions
elles retournent 0 si tout s'est bien passé
Néanmoins la solution de fOxi doit etre meilleur pour la gestion des erreurs

encore MERCI
Messages postés
5
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
25 juillet 2008

j'arrive donc à afficher un texte sur ma vidéo en overlay mais je ne peux pas modifié dynamiquement mon texte :
Cela ne marche pas
procedure TForm1.SetOverlayTextClick(Sender: TObject);
var
Rest : integer;
OvlText: TOverlayTextT;
Pos : TPoint;
r :integer;
TexteAffiche : array[0..MAX_OVLTEXT-1] of char;
begin
Pos.X:= 10;
Pos.Y:=15;
TexteAffiche:=' Montexteaffiché';

OvlText.text : = TexteAffiche;
OvlText.fontidx := 2;
OvlText.reserved :='reserved';
r:=SN_SetOverlayText(0, @Pos, @OvlText, true, true, 0);
SetOverlayTextEdit.Text := inttostr(r);
end;

Cela marche
procedure TForm1.SetOverlayTextClick(Sender: TObject);
var
Rest : integer;
OvlText: TOverlayTextT;
Pos : TPoint;
r :integer;

begin
Pos.X:=10;
Pos.Y:=15;
OvlText.text :='Montexteaffiché';
OvlText.fontidx : = 2;
OvlText.reserved :='reserved';
r:=SN_SetOverlayText(0, @Pos, @OvlText, true, true, 0);
SetOverlayTextEdit.Text := inttostr(r);
end;

erreur : types incompatibles

pourtant ceux sont tous les deux desarray[0..MAX_OVLTEXT-1] of char

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
oui c'est le probleme des array of char.

tu peu essayer ceci :

OvlText.text := copy(EditX.Text, 1, MAX_OVLTEXT);

ou encore si ça ne marche pas

var
  S : string;
begin
  S := EditX.Text; // le maxlength du TEdit doit etre reglé a MAX_OVLTEXT
  FillChar(OvlText.text, MAX_OVLTEXT, #0);
  Move(OvlText.text, S[1], Length(S));
  { ... }
end;

si tu veux definir des message constant :

type
  TOvlText = array[0..MAX_OVLTEXT-1] of char;

  overlay_text_t = record
     text : TOvlText;
    ...
  end;

const
  OVLTEXT_BONJOUR : TOvlText = 'Bonjour'+#0;

<hr size="2" width="100%" />
Messages postés
5
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
25 juillet 2008

Merci pour ces infos et bon week end
j'ai essayé les deux premières méthodes mais il me renvoit -1 on failure
je vais tester ca plus profondement mardi
en tout cas merci pour ton aide