PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → AppelDLL32 et paramètres retournés
AppelDLL32 et paramètres retournés
Débuté par TH, 09 nov. 2006 12:41 - 6 réponses
Posté le 09 novembre 2006 - 12:41
Bonjour à tous.
Je m'en remets désesperemment à vous en espérant enfin avoir la solution.

J'ai une DLL que je développement en C++ sous Visual Studio 2003. Je souhaite donc interfacer mon programme développé sous Windev avec ma DLL.
Mon problème se situe dans l'appel de mes fonctions contenues dans la DLL.

J'ai, par exemple, une fonction dont le prototype est le suvant :

void MaFonction(int param1, __int64* param2);

(note: __int64 est un type de variable sous VC équivalent à un entier sur 8 octets sous Windev)

Le but est donc d'appeler cette fonction et de récupérer le contenu de param2.
Si j'utilise WDAPI, voici le code que je suis censé mettre sous Windev:

param1 est un entier // Type C :int
param2 est un entier // Pointeur
API("NOMDLL.DLL","maFonction",param1,param2)

Malheureusement, param2 reste désesperement à 0 ... et dans ma fonction je trace bien que le pointeur y est renseigné.

Si quelqu'un pouvait enfin m'expliqué comment récupérer cette variable avant que je devienne dingue, je luis serais extrement reconnaissant!!!!
Posté le 09 novembre 2006 - 13:10
Bonjour,

si dans la dll votre fonction est : void MaFonction(int param1, __int64*
param2);
alors l'appel windev doit être :

param1 est un entier // Type C :int
param2 est un entier // Pointeur
API("NOMDLL.DLL","maFonction",param1,&param2)


le deuxieme parametre est un pointeur dans la dll il faut passer l'adresse
de votre parametre 2
je pense que vous avez confondu entier representnant un pointeur et la
notion de pointeur en C

Firetox

"TH" <guest@newsgroup.fr> a écrit dans le message de news:
455303e0$1@news.pcsoft.fr...

Bonjour à tous.
Je m'en remets désesperemment à vous en espérant enfin avoir la solution.

J'ai une DLL que je développement en C sous Visual Studio 2003. Je
souhaite donc interfacer mon programme développé sous Windev avec ma DLL.
Mon problème se situe dans l'appel de mes fonctions contenues dans la DLL.

J'ai, par exemple, une fonction dont le prototype est le suvant :

void MaFonction(int param1, __int64* param2);

(note: __int64 est un type de variable sous VC équivalent à un entier sur
8 octets sous Windev)

Le but est donc d'appeler cette fonction et de récupérer le contenu de
param2.
Si j'utilise WDAPI, voici le code que je suis censé mettre sous Windev:

param1 est un entier // Type C :int
param2 est un entier // Pointeur
API("NOMDLL.DLL","maFonction",param1,param2)

Malheureusement, param2 reste désesperement à 0 ... et dans ma fonction je
trace bien que le pointeur y est renseigné.

Si quelqu'un pouvait enfin m'expliqué comment récupérer cette variable
avant que je devienne dingue, je luis serais extrement reconnaissant!!!!
Posté le 09 novembre 2006 - 13:30
Vu que __int64* est un pointeur, il faudrait passer une adresse afin que ta DLL puisse modifier la valeur de param2.

Essaye donc : API("NOMDLL.DLL","maFonction",param1,&param2)
Posté le 09 novembre 2006 - 14:04
j'aurais mis :

API("NOMDLL.DLL","maFonction",param1,&Param2)

tiens nous au courrant.
Posté le 09 novembre 2006 - 15:02
Mea Culpa, c'est bien évidemment
API("NOMDLL.DLL","maFonction",param1,&Param2)

Ce que j'avais d'ailleurs précédemment fait avant de faire appel a WDAPI qui fait donc une erreur dans la transcription de l'appel.

Mon problème ne venait donc pas de l'appel (que j'avais bien écrit avec un "&") mais de ma dll ... comme quoi.
Cependant, si je peux continuer sur le sujet, et qu'une âme bien vaillante à la réponse, je me pose tout de même une question.
Si je reprends ma fonction dans ma dll, et prenons un exemple avec le prototypage exact :

////// CODE DE LA DLL
__int64 g5454354; //Variable globale dans la dll.
extern "C" void __declspec( dllexport ) mafonction(__int64* t)
{
*t=g; //Méthode 1 : Ecrit comme ça, ça marche
//t=&g; // Méthode 2 : Ca ne marche pas.
}

J'avais écrit dans mon code la méthode 2, mais ça ne fonctionne pas. J'imagine que le pointeur retourné n'est pas valide en dehors de la dll. (j'utilise le retour de la fonction avant de la déchargé, sinon bien évidement le pointeur ne serait plus valide).

Donc, j'ai fait la méthode 1 et ça fonctionne, seulement ça me pose un sérieux pb.
Côté Windev, j'appelle cette fonction comme ça :
Param1 est un entier
API("NOMDLL.DLL","maFonction",&Param1)

Ce qui me dérange, c'est que "mafonction" reçoit donc bien un pointeur, mais comme je ne peux (apparement) pas récupérer l'adresse, je suis obligé de copier le contenu de ma variable dans la valeur du pointeur reçu en paramètre :
*t=g;

Or t est bien un pointeur, mais *t est un entier (Param1). J'ai donc forcement un écrasement mémoire à cet emplacement ... non?

Si quelqu'un pouvait m'éclairer ...
Posté le 09 novembre 2006 - 15:43
Vu que 't' est un pointeur, il contient bien de l'adresse de ta variable : t = &param1.

Et donc forcément *t modifie la valeur de param1 et après l'appel de ta fonction : param1 = g.

Tu viens donc de modifier la valeur contenue dans 'param1' mais je pensais que c'était le but de la fonction et de l'utilisation d'un pointeur.

Je n'ai pas donc compris où était ton problème, ni ce que tu voulais faire avec cette fonction.


D'autre part, il est normal que t=&g ne fonctionne pas.
En effet, cela modifie juste l'adresse du pointeur et celui-ci ne pointe plus du tout sur 'param1' mais sur 'g' (et donc cette instruction ne sert pas à grand chose).

Voilà, si tu peux nous apporter plus de détails sur ce que tu souhaites faire, on pourra surement t'aider.

Hemmya.
Posté le 10 novembre 2006 - 16:47
mea culpa bis, je me perdais dans ce que je voulais faire ...

merci de votre aide.