begin process at 2012 05 29 21:36:44
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Autre

 > 

problème de passage de fonctions via dll


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

problème de passage de fonctions via dll

vendredi 27 novembre 2009 à 22:22:32 | problème de passage de fonctions via dll

youppyy

Bonjour,

J'ai deux fonctions sont enregistrées dans une dll ecrite en langage C sur Dec-c++ :
J'ai une fonction A qui renvoie une donnée et une fonction B qui appelle la fonction A, et ecrit la donnée renvoyée dans un fichier .txt.

Le fichier .h ressemble à ça :

Code C/C++ :
#include <stdio.h>
#include <string.h>
#include <windows.h>

#define export __declspec(dllexport) 

int méthode_A();
export int __stdcall méthode_B(paramètres pris par la fonction);


D'autre part, j'ai un module vba-Excel. Je souhaite pouvoir appeler la méthode B dedans via la dll.

Code Visual Basic :
Public Declare Sub méthode_B Lib "madll.dll" (paramètres)

Sub test()

Call méthode_B(paramètres que je lui passe)
    
End Sub


Le but est qu'en exécutant ce code, le fichier texte se crée avec la donnée (générée par la méthode A) dedans.
Cependant, ce qui arrive est que le fichier se crée mais reste vide.

J'ai testé les méthodes C séparemment et le problème ne vient pas de ces méthodes.
Je pense qu'il y a une erreur dans la liaison dll-module vba, mais je n'arrive pas à savoir laquelle. C'est la première fois que j'utilise une dll.

Est ce que par exemple il faut que j'exporte la méthode A même si je ne l'appelle directement pas dans le module vba?
Voyez vous une autre erreur sinon?

Merci d'avance pour votre aide.

vendredi 27 novembre 2009 à 23:51:53 | Re : problème de passage de fonctions via dll

BruNews

Administrateur CodeS-SourceS
Si Excel ne hurle pas c'est qu'il a bien trouvé la fonction dans la dll.
Ce qui n'est pas appelé de l'extérieur n'a pas à être exporté.
J'ai fait des tas d'exemples de DLL pour VB, toutes testées depuis Excel. Voir ici sur cppfrance et sur vbfrance.

ciao...
BruNews, MVP VC++
samedi 28 novembre 2009 à 10:23:32 | Re : problème de passage de fonctions via dll

youppyy

Je n'ai pas appelé la méthode A de l'extérieur. Donc oui, comme tu le dis elle n'a pas été exportée. Mais j'ai pas besoin qu'elle le soit, si?
Je veux dire : Est ce qu'il faut que je l'exporte pour pouvoir utiliser la méthode B (vu que B appelle A) ?

Merci
samedi 28 novembre 2009 à 11:53:12 | Re : problème de passage de fonctions via dll

BruNews

Administrateur CodeS-SourceS
Mais enfin c'est clair.
Si Excel doit appeler funcA(), c'est funcA() qui doit être exporté et rien de plus.

ciao...
BruNews, MVP VC++
samedi 28 novembre 2009 à 11:58:53 | Re : problème de passage de fonctions via dll

youppyy

Merci BruNews.
C'est bien ce que j'avais fait ...
Je comprends pas c'est quoi mon erreur si ce n'est pas dû à cela.
dimanche 29 novembre 2009 à 13:22:21 | Re : problème de passage de fonctions via dll

rt15

Membre Club Administrateur CodeS-SourceS
Salut,

Tu peux montrer les signatures complètes (paramètres) que ce soit en C et en VB ? Déjà on voit que la fonction C renvoie un int alors que sous VB tu déclares une procédure, donc sans valeur de retour (Ce n'est cependant pas la cause de l'erreur non plus).
jeudi 24 décembre 2009 à 21:18:38 | Re : problème de passage de fonctions via dll

youppyy

Bonjour,

Afin de trouver la source du problème, j'ai essayé de faire un test : J'ai voulu voir si l'entier passé en paramètre dans la sub VBA est bien reçu par la méthode C. J'ai voulu donc écrire dans un fichier la valeur de ce paramètre et justement, ce n'est pas le bon nombre qui est écrit.

Voici le code :

Fichier dllmain.c :

Code C/C++ :
#include "dll.h"
#include <stdlib.h>
#include <stdio.h>

void __stdcall ecriture(int t)
{ FILE * fich = fopen("fichier_test.txt", "w");
  fprintf(fich,"%d\n",t);
  fclose(fich);
}


Fichier dll.h :
Code C/C++ :
#include <stdio.h>
#include <string.h>
#include <windows.h>

#define export __declspec(dllexport) /* définit la macro EXPORT  */

export void __stdcall ecriture(int t);


Code vba depuis Excel :
Code Visual Basic :
Declare Sub ecriture Lib "Projet_test.dll" (t As Integer)

Sub test()
Call ecriture(5)
End Sub


Résultat : Le fichier est bien créé, mais la valeur dedans est "1308054" !
Je ne comprends pas pourquoi ça fait ça...

Merci beaucoup pour votre aide.
jeudi 24 décembre 2009 à 22:14:21 | Re : problème de passage de fonctions via dll

BruNews

Administrateur CodeS-SourceS
As Long !!!
Integer de VB est 16 bits.

Aussi mets du pur code Windows dans ta DLL (CreateFile, WriteFile, etc), tu pourras ainsi éviter le CRT et ainsi sortir ta DLL 3 Ko.

ciao...
BruNews, MVP VC++
jeudi 24 décembre 2009 à 22:17:29 | Re : problème de passage de fonctions via dll

youppyy

J4avais deja essayé avec As Long, et là je viens de réessayer, ça ne change rien.
Merci quand même BruNews
jeudi 24 décembre 2009 à 23:00:24 | Re : problème de passage de fonctions via dll

youppyy

Problème résolu!

Il faut bien mettre un Long et en plus ajouter "ByVal".

Donc il faut mettre :

Declare Sub ecriture Lib "Projet_test.dll" (ByVal t As Long)

Merciiiiii !!


Cette discussion est classée dans : fichier, fonction, code, dll, méthode


Répondre à ce message

Sujets en rapport avec ce message

Utiliser un plugin (en dll) [ par CyberP ] Comment utiliser un plugin ? Le charger et utiliser les fonctions qui sont à l'intérieur ?Je compile un fichier en dll avec une fonction "dire_bonjour PB d'E/S fichier avec une DLL [ par huberdine ] Je cherche a faire une DLL en C, dans la quelle je puisse faire des E/S fichier.Mon probleme est le suivant : la fonction fopen refuse de fonctionner Lecture dans un fichier [ par Vincentsoft ] Salut tout le monde,J'ai un petit problème. Je veux compter (en C) le nombre d'octet d'un fichier.J'ai écris cette fonction,int TailleFichier(char * Ordre des fonction dans le .def d'une DLL [ par Mastersam ] Bonjour je voudrais savoir comment déterminer l'ordre que vont avoir les fonctions d'une dll dans le fichier .def.Car pour l'instant j'ai défini 3 fon Appel d'une fonction contenue dans une dll [ par ybuchheit ] Bonjour, je souhaiterais appeler une fonction contenue dans une dll. Je n'ai pas le source de cette dll, le seul fichier dont je dispose est le .dll Probleme concernant la méthode Move [ par fab3131 ] Je code sous visual.net et jai un petit soucis conceranant la méthode move qui me permet de déplacer un fichier texte d'un endroit a un autre en cliqu dll sous devc++ [ par AmelCres ] Bonjour,J ai besoin d'un ptit coup de main :Je dois faire une DLL sous DevC++, et je ne sais pas comment m'y prendre.J'ai le fichier .h .cpp et j ai c fonction qui retourne une structure [ par lamiaa1984 ] Bonjour tout le Mondeje souhaite lire un ficher et mettre ses valeurs dans des variables, puis je veux affecter ces variable dans des variable d'une s fonction dans dll qui fait planter programme [ par pitch069 ] Bonjour,je travail actuellement sur un code C++, sous dev c++. j'utilise une dll au travers d'un *.lib et dans mon programme principal je fais appel a appeler une fonction c++ contenu dans dll avec de code c++ [ par avg ] j'ai une fonction qui est sous une class dans un dll déclarer comme ce ci : [code=cpp]C_MORPHO_User::C_MORPHO_User()[/code] j'ai appeler dll avec Load


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,997 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales