OVH Cloud OVH Cloud

DLL

8 réponses
Avatar
GPVISION
Bonjour

j'ai développé des DLLs en C/C++ (qui en appelle d'autres mais pas écrites
par mes soins) pour un client qui utilise WinDev 8.0
Il rencontre un problème lors de l'appel des fonctions. Son logiciel lui dit
que la fonction appelée est introuvable. La DLL est bien
chargée.
Pour info la DLL est utilisée dans d'autres logiciels (hors WinDev) sans
aucun problème.

Y a t-il des contraintes d'écritures de DLLpour l'environnement WinDev ? Si
oui où puis je les trouver ?
Le problème reste entier pour les DLLs qui ne sont pas de moi !!!

Merci
Cordialement

Philippe

8 réponses

Avatar
Gégé
GPVISION wrote:
j'ai développé des DLLs en C/C++ (qui en appelle d'autres mais pas écrites
par mes soins) pour un client qui utilise WinDev 8.0
Il rencontre un problème lors de l'appel des fonctions. Son logiciel lui dit
que la fonction appelée est introuvable. La DLL est bien
chargée.



Attention, les fonctions export sont sensibles à la casse
Avatar
Manu
> j'ai développé des DLLs en C/C++ (qui en appelle d'autres mais pas
écrites par mes soins) pour un client qui utilise WinDev 8.0
Il rencontre un problème lors de l'appel des fonctions. Son logiciel
lui dit que la fonction appelée est introuvable. La DLL est bien
chargée.



Pour les accès [alter]natifs et divers autres projets, nous utilisons les
DLL à tout va. Le problème de fonction appelée introuvable apprait quand la
fonction n'existe pas dans la dll ou qu'elle est appelée avec un nombre de
paramètres différent ou de mauvais typage.

Pour info la DLL est utilisée dans d'autres logiciels (hors WinDev)
sans aucun problème.
Y a t-il des contraintes d'écritures de DLLpour l'environnement
WinDev ? Si oui où puis je les trouver ?



Pour utiliser les chaines de caractères C (char *) il faut passer des
chaines ASCIIZ.

Le problème reste entier pour les DLLs qui ne sont pas de moi !!!



--
Emmanuel
Avatar
GPVISION
Bonjour,

Pour les accès [alter]natifs et divers autres projets, nous utilisons les
DLL à tout va. Le problème de fonction appelée introuvable apprait quand


la
fonction n'existe pas dans la dll ou qu'elle est appelée avec un nombre de
paramètres différent ou de mauvais typage.



OK je ne pense que le client ai fait ce type d'erreur. Par contre y a t-il
des typages que WinDev8.0 n'aiment pas.
Je travaille dans le traitement d'images et j'ai des structures assez
importantes, tous les types possibles du C et C++
(double, float, int, unsigned char, unsigned short, etc.)
De plus le client désirai une classe. J'ai donc une DLL basée autour d'une
classe. WinDev doit instancier un objet
à partir de cette classe pour accéder aux différentes méthodes et
propriétés. Est ce possible ?
exemple en C++
class __declspec(dllexport) MyClass
{
Public:
MyClass();
~MyClass();

int UneVariable;
int UneFonction( unsigned char* pImage, long Width, long Height);
......
}

ensuite dans le code on doit trouver :
MyClass monObjet;
monObjet.UneVariable = 10;
....

Pour utiliser les chaines de caractères C (char *) il faut passer des
chaines ASCIIZ.


ASCIIZ pas courant en C. Hormis pour les conversions de nombres en chaines
de caractères.
Il s'agit de mémoire d'avoir un NULL Terminated en fin de chaine ?

Je ne connais pas du tout WinDev, je suis codeur C/C++ depuis des lustres.
Merci pour vos réponses.
Philippe
Avatar
GPVISION
Re

> j'ai développé des DLLs en C/C++ (qui en appelle d'autres mais pas


écrites
> par mes soins) pour un client qui utilise WinDev 8.0
> Il rencontre un problème lors de l'appel des fonctions. Son logiciel lui


dit
> que la fonction appelée est introuvable. La DLL est bien
> chargée.

Attention, les fonctions export sont sensibles à la casse



Qu'entendez vous par sensibles à la casse ?

Merci
Philippe
Avatar
Manu
> OK je ne pense que le client ai fait ce type d'erreur. Par contre y a
t-il des typages que WinDev8.0 n'aiment pas.
Je travaille dans le traitement d'images et j'ai des structures assez
importantes, tous les types possibles du C et C++
(double, float, int, unsigned char, unsigned short, etc.)



Pour cela il y a des experts API qui trainent ici. Moi, je n'utilise que int
et char *. Si je dois utiliser des float je fais de sprintf :-).

De plus le client désirai une classe. J'ai donc une DLL basée autour
d'une classe. WinDev doit instancier un objet
à partir de cette classe pour accéder aux différentes méthodes et
propriétés. Est ce possible ?



Je pense qui oui avec les fonctions windev (il y a un exemple dans une LST).

exemple en C++
class __declspec(dllexport) MyClass
{
Public:
MyClass();
~MyClass();

int UneVariable;
int UneFonction( unsigned char* pImage, long Width, long Height);
......
}



ensuite dans le code on doit trouver :
MyClass monObjet;
monObjet.UneVariable = 10;
....



ce serait l'idéal...

Pour utiliser les chaines de caractères C (char *) il faut passer des
chaines ASCIIZ.


ASCIIZ pas courant en C. Hormis pour les conversions de nombres en
chaines de caractères.
Il s'agit de mémoire d'avoir un NULL Terminated en fin de chaine ?



Oui cela dit à windev que la chaine est en "null char terminated".

Je ne connais pas du tout WinDev, je suis codeur C/C++ depuis des
lustres. Merci pour vos réponses.



De rien.
Avatar
GPVISION
Merci pour vos réponses.
Cordialement
Philippe
Avatar
Gégé
GPVISION wrote:
Qu'entendez vous par sensibles à la casse ?



TOTO <> Toto <> toto <> toTo ...
Avatar
elecoest
> De plus le client désirai une classe. J'ai donc une DLL basée autour d'une
classe. WinDev doit instancier un objet
à partir de cette classe pour accéder aux différentes méthodes et
propriétés. Est ce possible ?



Tests effectués, je ne pense pas que cela puisse marcher :-(

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.

Voilà voilà, je pense que vous avez trouvé un cas ou Windev n'est pas
approprié en direct. Je dis direct car rien ne vous empeche d'avoir des
appels de fonctions "standard" au lieu d'utiliser une classe. Mais bon si le
client l'a demandé...

--
Emmanuel