DLL passant une structur

oberown Messages postés 88 Date d'inscription mercredi 10 mars 2004 Statut Membre Dernière intervention 5 juillet 2005 - 19 juil. 2004 à 17:09
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 20 juil. 2004 à 14:14
Est-il possible de faire une dll en C++ qui a comme point de sortit renvoie une structure, et que ca soit sur delphi qu'il le recupere ?

Si oui comment ?

Merci

21 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
19 juil. 2004 à 17:19
En sortie, une func que soit dans dll ou autre ne peut fournir qu'un long 32 bits (EAX). Tu dois fournir en param adresse de ta struct et la func lit et remplit ses champs.

ciao...
BruNews, Admin CS, MVP Visual C++
0
oberown Messages postés 88 Date d'inscription mercredi 10 mars 2004 Statut Membre Dernière intervention 5 juillet 2005
19 juil. 2004 à 17:35
Alors comment faire pour passer plusieurs variables en une fois ?

PS: J'avoue n'avoir pas tout compris a ton explication.
0
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
19 juil. 2004 à 17:39
Ta structure en mémoire à une adresse (la ou elle débute).
C'est cette adresse que tu vas donner et la fonction elle va prendre parcourir la structure et/ou modifier cette dernière grace à cette adresse.

Je mettrai un exemple ce soir sur le site.

@+
Arnotic,
Admin CS, MVP Visual C++
0
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
19 juil. 2004 à 21:12
Comme promis j'ai posté un code.

Tu le trouveras à l'adresse suivante : http://www.cppfrance.com/code.aspx?ID=24723

@+
Arnotic,
Admin CS, MVP Visual C++
0

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

Posez votre question
oberown Messages postés 88 Date d'inscription mercredi 10 mars 2004 Statut Membre Dernière intervention 5 juillet 2005
20 juil. 2004 à 09:16
Merci beaucoup pour l'exemple.

Mais je voulais aussi savoir si j'utilise ma dll dans un programme Delphi il sera capable de reconnaitre la structure ?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juil. 2004 à 09:22
Une dll ne 'reconnait' rien du tout, on lui passe une adresse et elle travaille. L'appelant est simplement responsable de passer une adresse correcte pointant sur une structure attendue et rien de plus.

ciao...
BruNews, Admin CS, MVP Visual C++
0
oberown Messages postés 88 Date d'inscription mercredi 10 mars 2004 Statut Membre Dernière intervention 5 juillet 2005
20 juil. 2004 à 10:00
Alors comment faire sous delphi pour utiliser la structure passé ?
0
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
20 juil. 2004 à 10:11
Tu connais l'adresse de ta structure (où elle se trouve en mémoire).

Donc il te suffit de la parcourir soit grace à un pointeur soit en ayant définit la structure (comme dans mon exemple) et aller y piocher les membres.

Par exemple pour une structure qui contient :

char sz1[256];
char sz2[256];
int i;

l'adresse X te donnera sz1 X+256 te donnera sz2 et X+512 te donnera i;

C'est assez clair ?

@+
Arnotic,
Admin CS, MVP Visual C++
0
oberown Messages postés 88 Date d'inscription mercredi 10 mars 2004 Statut Membre Dernière intervention 5 juillet 2005
20 juil. 2004 à 10:14
Et si ma struct contient des éléments qui n'ont pas de tailles défini ?
Comment les récuperer ?
0
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
20 juil. 2004 à 10:18
Les élements on forcement une taille définit !

Ce que tu pourras trouver se sont des pointeurs (4 Octets)
exemple :

char sz1[256];
char char *p;
int i;

l'adresse X te donnera sz1 X+256 te donnera p et X+260 te donnera i;

Voilà

@+
Arnotic,
Admin CS, MVP Visual C++
0
oberown Messages postés 88 Date d'inscription mercredi 10 mars 2004 Statut Membre Dernière intervention 5 juillet 2005
20 juil. 2004 à 11:27
Je n'arrive pas à le faire marcher :-(

Dans ma DLL j'ai ça :

typedef struct {
LPCTSTR champ1;
LPCTSTR champ2;
}MyStruct;

extern "C" AFX_EXT_API MyStruct * GetStruct()
{
MyStruct * test;
test->champ1="salut";
test->champ2="toto";
return test;
}


Sous delphi j'ai ceci

GetStruct:function():pointer;cdecl;
/* du code*/
var
  p : pointer;
begin
beginp := GetStruct();


Mais qd j'appelle GetStruct ca plante ! J'ai un message d'erreur d'adresse
0
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
20 juil. 2004 à 11:33
LPCTSTR représente un pointeur et toi tu fais : test->champ1="salut"; ce qui est faux.

Il faut copier à cette adresse là tu modifies l'adresse.

strcpy(champ1, "salut");

irait mieux.

@+
Arnotic,
Admin CS, MVP Visual C++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juil. 2004 à 11:40
MyStruct * test;
on affecte des champs a 'test' qui ne pointe encore sur RIEN !!!
Alloue la memoire avant et encore faudra-t-il que tu puisses la liberer correctement depuis delphi.

Cette dll doit aller aux oubliettes le plus rapidement possible.

ciao...
BruNews, Admin CS, MVP Visual C++
0
oberown Messages postés 88 Date d'inscription mercredi 10 mars 2004 Statut Membre Dernière intervention 5 juillet 2005
20 juil. 2004 à 12:09
Voici mes modifs

typedef struct {
LPCTSTR champ1;
LPCTSTR champ2;
}MyStruct;

extern "C" AFX_EXT_API MyStruct * GetStruct()
{
MyStruct test;
test.champ1="salut";
test.champ2="tot";
return &test;
}


Et sous delphi

  Mystruct = record
    champ1 : Pchar;
    champ2 : Pchar;
    end;

GetStruct:function():Mystruct;cdecl;

procedure TForm1.Button1Click(Sender: TObject);
var
  p : Mystruct;
begin
  if @GetStruct<>nil then
    begin
    p := GetStruct();
    Label1.Caption := p.champ1;
    Label2.Caption := p.champ2;

    end;
end;


Mais dans mes labels j'obtients des caractères tout bizare, où est mon erreur ?

Est encore merci de votre aide.

Mon problème c'est que je suis obligé de faire une structure pour passer plusieurs variables en même temps.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juil. 2004 à 12:13
Ta structure doit etre declaree sous delphi et passee en param a la DLL tout comme on fait avec API Windows GetWindowRect().

ciao...
BruNews, Admin CS, MVP Visual C++
0
oberown Messages postés 88 Date d'inscription mercredi 10 mars 2004 Statut Membre Dernière intervention 5 juillet 2005
20 juil. 2004 à 12:22
BurNews pourtant je l'ai fait, regarde dans le code au-dessus.
J'avais déjà marqué ça.
La structure déclaré :

Mystruct = record
champ1 : Pchar;
champ2 : Pchar;
end;

Et le parametre:

GetStruct:function():Mystruct;cdecl;
0
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
20 juil. 2004 à 12:24
Mais ou alloue tu la mémoire pour y mettre après ton texte ?

@+
Arnotic,
Admin CS, MVP Visual C++
0
oberown Messages postés 88 Date d'inscription mercredi 10 mars 2004 Statut Membre Dernière intervention 5 juillet 2005
20 juil. 2004 à 12:29
Pour faire du strcpy( test->champ1, "salut");
champ1 doit etre un char, et qd je le fait au moment d'utiliser p := GetStruct(); dans delphi ca plante mon appli
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juil. 2004 à 12:37
La tu melanges tout, modif remodif, faut un modele et s'y tenir.
Ecris tout en C et ira bien mieux.

ciao...
BruNews, Admin CS, MVP Visual C++
0
oberown Messages postés 88 Date d'inscription mercredi 10 mars 2004 Statut Membre Dernière intervention 5 juillet 2005
20 juil. 2004 à 14:05
Si je pouvais tout faire en C, je le ferais.

Je suis obligé de créer une dll en C++, pour l'utiliser en delphi.
0
Rejoignez-nous