Déclaration d'une struct contenue dans une DLL C++

cs_Sharleen Messages postés 4 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 19 janvier 2007 - 5 mai 2006 à 11:44
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 12 mai 2006 à 19:12
Déjà, bonjour ! ^^

Voici mon problème :
Je construis une DLL en C++, qui comprend une structure ayant la forme suivante :

__declspec(dllexport) __stdcall struct CarreControle{
int Left, Top, Right, Bottom;
double r,g,b;
};

Mon soucis est que j'essai d'utiliser cette DLL dans une application Delphi, et je ne sais pas comment déclarer la structure en Delphi...
Et après quelques heures passées sous Google, je n'ai toujours aps trouvé ce qui m'interressait...

Voilà, merci par avance !

10 réponses

elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
5 mai 2006 à 14:57
Et si tu refait ta structure dans Delphi, çà t'evitera d'aller la chercher !

type CarreControle = record
Left, Top, Right, Bottom : Integer;
r,g,b : Double;
end;
0
cs_Sharleen Messages postés 4 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 19 janvier 2007
5 mai 2006 à 15:21
J'ai déjà tenté cette solution : ma structure n'était pas passée dans la DLL, mais je la redéclarais de la même manière que celle que tu as proposé...

Mais le compilateur me renvoyait ça comme erreur :

Type of actual and formal var parameters must be identical

Quand j'essayais de compiler ma fonction utilisant la variable CarreControle :

Déclaration de la fonction dans la DLL C++ :

int __declspec(dllexport) __stdcall LaunchVisucolorimetre(int SettingMode, int Rayon, int Taille_Carre, int Taille_Crop,
bool Montre_Log_LightCtrl, bool Montre_MoyIm, bool Montre_MoyCarre,
double & RougeMoyImg, double & VertMoyImg, double & BleuMoyImg, CarreControle CarreN )

Déclaration de la fonction DLL dans le fichier Delphi:

FUNCTION LaunchVisucolorimetre( SettingMode, Rayon, Taille_Carre, Taille_Crop : integer;
Montre_Log_LightCtrl, Montre_MoyIm, Montre_MoyCarre : boolean;
RougeMoyImg, VertMoyImg, BleuMoyImg : double;
CarreN : CarreControle
) : integer; stdcall ; external 'Project_DLL_Canon.dll';

Utilisation dans le code Delphi:

procedure TFormTestVisucolorimetre.ButtonGoClick(Sender: TObject);
var
SetMod, Rayon, Carre, Crop: integer;
Log, MoyIm, MoyCarre: bool;
AppliPath: string;
RougeMoyImg, VertMoyImg, BleuMoyImg: double;
CarreN : CarreControle;

begin
AppliPath:= ExtractFilePath(Application.exeName);

if(RadioButtonMire.Checked)then begin SetMod:=0; end;
if(RadioButtonFantome.Checked)then begin SetMod:=1; end;
if(RadioButtonPDV.Checked)then begin SetMod:=2; end;
Rayon:= strtoint(EditTailleCercle.Text);
Carre:= strtoint(EditTailleCarre.Text);
Crop:= strtoint(EditCrop.Text);
Log:= CheckBoxActiver.Checked;
MoyIm:= CheckBoxMoyenne.Checked;
MoyCarre:= CheckBoxControle.Checked;

LaunchVisucolorimetre(SetMod,Rayon,Carre,Crop,
Log,MoyIm,MoyCarre,
RougeMoyImg,VertMoyImg,BleuMoyImg,
CarreN);

C'est pour ça que je pensais plutôt déclarer ma structure dans la DLL, mais je ne sais pas comment déclarer une struct en Delphi... D'où ce topic :D
0
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
5 mai 2006 à 15:39
ba pour declarer une structure en delphi tu fais :

type <nom_structure> = record
<Variable> : <type>;
<Variable> : <type>;
...
<Variable> : <type>;
end;

Et pour avoir un pointeur sur ta structure tu peux ajouter endessous :
<Nom_Pointeur_Structure> = ^<nom_structure>;

Mais fait gaffe si tu as ce message c'est peu être que le type Integer ou Double sur Delphi n'est pas le meme que sur C.

Cà se trouve chacun des compilo code leur Entier sur un nombre d'Octet différents !!? A voir ... (Utilise DWORD au pire, c'est un type Windows..Donc il sera surement identique d'un editeur à l'autre)

Mais normalement la redefinition de structure, marche très bien !

J'espere que tu m'as compris :-s

A+
0
cs_Sharleen Messages postés 4 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 19 janvier 2007
5 mai 2006 à 16:09
J'ai déjà essayé avec un pointeur, et je voulais savoir comment déclarer une structure C++ (struct) comprise dans une DLL en Delphi (avec external ...)
Déclarer une structure de type Record, je savais déjà faire, et c'est Kaput aussi :)

Mais merci quand même ^^
0

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

Posez votre question
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
5 mai 2006 à 16:20
ah ba dsl :-( ...
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
5 mai 2006 à 22:49
un conseil, regarde la declaration de TRect dans l'unité Types de Delphi.
regarde au niveau des (*HPPEMIT ... *) c'est du C ... tu veras comment il gerent la structure TRect chez borland.

et en concordance de type entre C++ et Delphi :

Int = entier 32 bit signé (donc Integer)
Float = double réel 32 bit signé (Double) (en toute logique)

le type DWORD ou QWORD correspondent aux type Cardinal et Double (a verifier pour QWORD)
0
Emandhal Messages postés 194 Date d'inscription dimanche 2 mars 2003 Statut Membre Dernière intervention 10 octobre 2006 3
6 mai 2006 à 01:42
et ca, ca donne quoi?

Type
CarreControle = Packed Record
Left, Top, Right, Bottom: Integer;
r, g, b: Double;
end;


Tout problème a sa solution... Mais en général, celle que l'on trouve n'est jamais la bonne...
0
cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 mars 2012
6 mai 2006 à 03:05
Bone allez une chtite dernière avant le grand dodo !!! :p
en plus je vois que Delphifr m'a encore bien eu !!! car tout à l'heure j'avais répondu à ce message mais au moment de faire "Ajouter" j'ai eu droit à un bon "une erreur c'est produite lors de l'envoi ... patati patata... vous pouvez toujours tenter de recuperer vôtre message en tapant 3617 (T)ULLA(danlcul) 26 ?/min" lol j'exagère comme d'hab mais bon ... , une fois n'est pas coutume j'ai fait un copier/coller dans un txt par simple précaution
donc le voilà car je crois que ça vient de là :
----------------------------
Salut,

***"
__declspec(dllexport) __stdcall struct CarreControle{
int Left, Top, Right, Bottom;
double r,g,b; <=== double ça fait beaucoup pour une valeur RGB c'est pas byte ?
};***"

bon déja on exporte par une structure de type TRecord c'est inutile !!!, il suffit de déclarer dans Delphi la même Structure (parfois il est nécessaire d'ajouter "packed" record suivant la structure )

***"int __declspec(dllexport) __stdcall LaunchVisucolorimetre(int SettingMode, int Rayon, int Taille_Carre, int Taille_Crop,
bool Montre_Log_LightCtrl, bool Montre_MoyIm, bool Montre_MoyCarre,
double & RougeMoyImg, double & VertMoyImg, double & BleuMoyImg, CarreControle CarreN )***"

dans cette déclaration RougeMoyImg, VertMoyImg, BleuMoyImg sont de type "var"

ce qui nous donne
function LaunchVisucolorimetre(SettingMode , Rayon , Taille_Carre, Taille_Crop: Integer; Montre_Log_LightCtrl , Montre_MoyIm: Boolean, Montre_MoyCarre: Boolean; var RougeMoyImg , VertMoyImg, BleuMoyImg: Double; CarreControle : TCarreControle): integer; stdcall ; external 'Project_DLL_Canon.dll';
@+

------------------------------------------
0
cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 mars 2012
6 mai 2006 à 03:06
sur ce baille baille :D
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
12 mai 2006 à 19:12
Il me semble que QWORD, c'est simplement un int64, un entier 64 bits
signé quoi. Un WORD ça fait 16 bits, un DWORD 32, et un QWORD 64. Pour
les réels, j'aurais dit:



C Delphi

Float Single 32 bits

Double Double 64 bits



Et la blague habituelle des Booléens. Ceux du C++ sont très
probablement sur 16 bits, faut donc utiliser le WordBool de Delphi, et
non pas le Boolean.



Sans oublier que certains types sont supposés changer de taille au fure
et à mesure des version de Delphi. Par exemple, les integer risque de
faire 64 bits dans un avenir assez proche. C'est a la même chose en C.



Pour le packed, c'est une histoire d'alignement. Si on le sélectionne
pas, Delphi doit essayer de mettre les adresses des champs de la
structure sur des multiples de 32, de manière à avoir du code plus
rapide (Ptêt pour éviter les décalage de pile et tout ça). Mais un byte
prend alors 32 bits, dont 24 inutilisées... Mais tout est détaillé dans
l'aide, comme d'hab.
0
Rejoignez-nous