Problème de passage de fonctions via dll

youppyy Messages postés 7 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 24 décembre 2009 - 27 nov. 2009 à 22:22
youppyy Messages postés 7 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 24 décembre 2009 - 24 déc. 2009 à 23:00
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 :

#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.

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.

9 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 nov. 2009 à 23:51
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++
0
youppyy Messages postés 7 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 24 décembre 2009
28 nov. 2009 à 10:23
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 nov. 2009 à 11:53
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++
0
youppyy Messages postés 7 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 24 décembre 2009
28 nov. 2009 à 11:58
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
29 nov. 2009 à 13:22
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).
0
youppyy Messages postés 7 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 24 décembre 2009
24 déc. 2009 à 21:18
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 :

#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 :
#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 :
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 déc. 2009 à 22:14
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++
0
youppyy Messages postés 7 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 24 décembre 2009
24 déc. 2009 à 22:17
J4avais deja essayé avec As Long, et là je viens de réessayer, ça ne change rien.
Merci quand même BruNews
0
youppyy Messages postés 7 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 24 décembre 2009
24 déc. 2009 à 23:00
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 !!
0
Rejoignez-nous