ptitmanu
Messages postés23Date d'inscriptionmardi 30 novembre 2004StatutMembreDernière intervention 8 février 2005
-
1 déc. 2004 à 18:14
cs_Nebula
Messages postés787Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 7 juin 2007
-
2 déc. 2004 à 07:25
Bonjour,
Je programme une appli en Delphi qui utilise une DLL ecrite en VC++. Je fais appel à des méthodes de ma DLL qui me retourne des objets. Que dois je faire (et est ce possible) pour les récupérer et les utiliser en Delphi ?
Peux t on recuperer en retour de fonction (DLL C++):
- des structures ?
- des objets ?
- autre chose que des types primitifs ?
Quelles sont les limitations indiuites par l'utilisation d'une C RunTime differente en dehors des problemes d'allocation et desallocation de memoire ? (Visual C++ utilise msvcrt.dll et delphi utilise vcl70.bpl si je ne me trompe pas)
Il semble que les objets (au sens large...) sont recopiés dans l'espace memoire Delphi, mais je ne connais pas la limitation de cette recopie. Est ce une recopie de structure avec les problemes induits par l'utilisation de pointeurs: les objets pointés ne sont pas recopiés ?
Bref j'ai besoin des lumieres d'une personne s'étant déjà confronté au probleme. Je ne sais plus dans quelle direction chercher...
D'avance merci.
cs_Nebula
Messages postés787Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 7 juin 20072 2 déc. 2004 à 07:25
Salut,
Tout d'abord, un exe et une dll partagent le même espace mémoire dans le processus de l'exe, point n'est donc besoin de recopier les données entre les deux en effet.
Ensuite pour le runtime, peu importe : msvcrt n'est utilisée que si tu utilises des fonctions de la librairie standard C/C++, si tu utilises l'API Win32 uniquement tu n'auras pas de problèmes avec (on peut même la faire sauter du compilateur, j'ai un lien si cela te dit). D'ailleurs, les problèmes de mémoire ne surviennent qu'en de rares cas (et presque toujours liés aux threads... si tu n'en utilises pas, le risque est négligeable).
Pour les retours : tu peux passer un record (delphi = struct pour la dll) par adresse, ainsi :
type la_structure = record
a: integer;
b: integer;
c: array[0..MAX_PATH] of char;
end;
procedure appel_de_la_fonction_dans_la_dll;
var
une_struct: la_structure;
begin
je_prend_une_struct(une_struct);
showmessage(une_struct.c); // affichera 'coucou'
end;
Il est obligatoire de faire ainsi : les structures et les tableaux ne sont pas des types autorisés en retour, ou alors alloués dynamiquement et tu retournes le pointeur (sans oublier de libérer la mémoire dans la fonction qui a appelé la dll, bien sûr).
Dans la dll, cela donnerait :
struct la_structure {
int a,
int b,
char[0..MAX_PATH] c;
};
Dans la dll en C ou C++, tu n'as pas accès aux objets de Delphi (donc, exit les String entre autres) mais tu peux manipuler certains à partir de leur handle (comme les forms et la plupart des composants VCL encapsulant des contrôles Windows) avec l'API Win32.
Pour ce qui est de retourner et/ou manipuler d'autres objets, je n'en ai pas la moindre idée :-/
Il est possible que j'ai commis quelques erreurs (de plus je ne fais que du C, pas de C++), mais je n'ai pas encore dormi, donc ne pas m'en tenir rigueur... Bon courage ! ;-)