Utilisation fonction DLL C++ dans Delphi ,Prob : types incompatibles

Résolu
beberlemarin
Messages postés
5
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
25 juillet 2008
- 10 juil. 2008 à 12:23
beberlemarin
Messages postés
5
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
25 juillet 2008
- 25 juil. 2008 à 10:29
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

f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
38
11 juil. 2008 à 04:16
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%" />
3
f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
38
11 juil. 2008 à 04:21
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%" />
3
beberlemarin
Messages postés
5
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
25 juillet 2008

25 juil. 2008 à 10:29
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
3
beberlemarin
Messages postés
5
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
25 juillet 2008

11 juil. 2008 à 09:45
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
beberlemarin
Messages postés
5
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
25 juillet 2008

11 juil. 2008 à 12:03
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

0
f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
38
11 juil. 2008 à 13:38
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%" />
0
beberlemarin
Messages postés
5
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
25 juillet 2008

11 juil. 2008 à 17:13
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
0