OVH Cloud OVH Cloud

[WDx][DLL C++] Export de classes

4 réponses
Avatar
elecoest
Bonsoir,

J'ai eu une confirmation de mon présentiment : les classes exportées en C++
ne sont _QUE_ pour C++.

Donc pas pour Windev (ni VB, ni PB, ni...).

Les clients qui "imposent" un outil de dev (Windev) et un mode de
programmation avancé des dll (export class) devraient reconsidérer leur
vision. Soit ils font du VC++ (bonjour l'interface) soit ils du Windev avec
des dll "faciles".

--
Emmanuel

4 réponses

Avatar
Pierre-Yves TAVERNIER
Mais non, il faut ajouter dans les déclaratins de fonctions en c++ extern
"C" et la ça ira mieux.

PYT
"elecoest" a écrit dans le message de
news:cd13c3$kae$
Bonsoir,

J'ai eu une confirmation de mon présentiment : les classes exportées en


C++
ne sont _QUE_ pour C++.

Donc pas pour Windev (ni VB, ni PB, ni...).

Les clients qui "imposent" un outil de dev (Windev) et un mode de
programmation avancé des dll (export class) devraient reconsidérer leur
vision. Soit ils font du VC++ (bonjour l'interface) soit ils du Windev


avec
des dll "faciles".

--
Emmanuel




Avatar
elecoest
> Mais non, il faut ajouter dans les déclaratins de fonctions en c++ extern
"C" et la ça ira mieux.



Bonsoir Pierre-Yves,

Pour mes fonctions c'est bien ce que je fais et çà marche. Par contre si tu
connais la méthode (tu serais bien le premier à pouvoir m'aider) pour une
classe exportée je suis preneur!

Pour rappel, voici ce qui marche :

-- partie dll
struct st_result
{
int n;
char s[50];
} ;

st_result resultat ;

DLLIMPORT long MaFonction()
{
resultat.n = 10 ;
strcpy(resultat.s, "Hello World!");
return (long) &resultat ;
}

-- partie windev
hInst est un entier

nPtr est un entier sur 4 octets

resultat est composé de
n est un entier
s est une chaîne ASCIIZ sur 50
FIN

hInst = ChargeDLL("dll_wd7.dll")
SI hInst = 0 ALORS
Erreur("Erreur lors du chargement")
FIN

nPtr = AppelDLL32("dll_wd7","MaFonction")

Transfert(&resultat, nPtr, Dimension(resultat))
Info("n="+resultat.n, "s="+resultat.s)

DéchargeDLL(hInst)

Voici ce qui ne marche pas :

-- Partie dll
long DllClass::MaMethode()
{
resultat.n = 10 ;
strcpy(resultat.s, "Hello World!");
return (long) &resultat ;
}

et pour moi c'est normal car d'après mes recherches avec google je n'ai pas
trouvé d'exemple VB utilisant des classes C en dll exportées.

Autre remarque, voici ce que renvoie un "dumpbin /exports" :

8 0 000011AE MaFonction
1 1 000011F6 _ZN8DllClass9MaMethodeEv
2 2 000011E8 _ZN8DllClassC1Ev
3 3 000011DA _ZN8DllClassC2Ev
4 4 0000127A _ZN8DllClassD0Ev
5 5 0000124E _ZN8DllClassD1Ev
6 6 00001222 _ZN8DllClassD2Ev
7 7 0000C0D0 _ZTV8DllClass

On voit bien MaFonction mais pas MaMethode.
Avatar
Pierre-Yves TAVERNIER
il faut créer une dll qui s'occupera de faire l'interface entre c++ et
windev.



PYT
"elecoest" a écrit dans le message de
news:cd1a3n$rqv$
> Mais non, il faut ajouter dans les déclaratins de fonctions en c++


extern
> "C" et la ça ira mieux.

Bonsoir Pierre-Yves,

Pour mes fonctions c'est bien ce que je fais et çà marche. Par contre si


tu
connais la méthode (tu serais bien le premier à pouvoir m'aider) pour une
classe exportée je suis preneur!

Pour rappel, voici ce qui marche :

-- partie dll
struct st_result
{
int n;
char s[50];
} ;

st_result resultat ;

DLLIMPORT long MaFonction()
{
resultat.n = 10 ;
strcpy(resultat.s, "Hello World!");
return (long) &resultat ;
}

-- partie windev
hInst est un entier

nPtr est un entier sur 4 octets

resultat est composé de
n est un entier
s est une chaîne ASCIIZ sur 50
FIN

hInst = ChargeDLL("dll_wd7.dll")
SI hInst = 0 ALORS
Erreur("Erreur lors du chargement")
FIN

nPtr = AppelDLL32("dll_wd7","MaFonction")

Transfert(&resultat, nPtr, Dimension(resultat))
Info("n="+resultat.n, "s="+resultat.s)

DéchargeDLL(hInst)

Voici ce qui ne marche pas :

-- Partie dll
long DllClass::MaMethode()
{
resultat.n = 10 ;
strcpy(resultat.s, "Hello World!");
return (long) &resultat ;
}

et pour moi c'est normal car d'après mes recherches avec google je n'ai


pas
trouvé d'exemple VB utilisant des classes C en dll exportées.

Autre remarque, voici ce que renvoie un "dumpbin /exports" :

8 0 000011AE MaFonction
1 1 000011F6 _ZN8DllClass9MaMethodeEv
2 2 000011E8 _ZN8DllClassC1Ev
3 3 000011DA _ZN8DllClassC2Ev
4 4 0000127A _ZN8DllClassD0Ev
5 5 0000124E _ZN8DllClassD1Ev
6 6 00001222 _ZN8DllClassD2Ev
7 7 0000C0D0 _ZTV8DllClass

On voit bien MaFonction mais pas MaMethode.





Avatar
elecoest
"Pierre-Yves TAVERNIER" a écrit dans le
message de news: 40f42c56$0$30275$
il faut créer une dll qui s'occupera de faire l'interface entre c++ et
windev.



çà c'est la solution "simple". J'y avais pensé : si Windev ne peux pas le
faire alors on fait une dll d'interface.
Mais la _grande_ question était de savoir si on pouvait s'en passer !

Merci quand même pour ton avis (un de plus dans le sens ou ce n'est pas
faisable en direct;-))

--
Emmanuel