Créer une dll pour VB ou VBA

Messages postés
1
Date d'inscription
samedi 17 juillet 2004
Statut
Membre
Dernière intervention
18 juillet 2004
- - Dernière réponse : fbossens
Messages postés
3
Date d'inscription
dimanche 26 avril 2009
Statut
Membre
Dernière intervention
28 avril 2009
- 28 avril 2009 à 22:32
Bonjour,

Je cherche à créer une dll qui soit compatible avec Visual Basic ou VBA. Quand je crée une dll en C avec visual studio il est en effet impossible de l'utiliser avec Excel VBA. Quelqu'un peut-il me venir en aide svp ?

D'autre part quelqu'un connait-il une bonne façon de bien apprendre Visual Studio, par un livre ou un tutorial ?

D'avance merci

dreads
Afficher la suite 

16 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
0
Merci
J'ai fait exemple de cela en source et repondu a cette question plusieurs fois dans le forum.

ciao...
BruNews, Admin CS, MVP Visual C++
Commenter la réponse de BruNews
Messages postés
2
Date d'inscription
vendredi 1 octobre 2004
Statut
Membre
Dernière intervention
1 octobre 2004
0
Merci
J'ai le même problème.
J'arrive pas à bien remplir le working directory dans les settings afin de faire comprendre à ma dll quelle doit être lier à un fichier excel.

merci pour toute réponse.

cloclo
Commenter la réponse de claudenjikam
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
0
Merci
Comment ça, une dll 'liee' a un fichier Excel ???
C'est le vba dans Excel qui va se servir de la dll mais la dll ne sera liee QUE au systeme si elle est ecrite correctement.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
83
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
4 mars 2008
0
Merci
Bonjour,

J'ai ecris une DLL très simple. Voilà le code:

extern

"C"
__declspec(
dllexport)
int
__stdcall somat (
int x,
int y){

int somatr;
somatr = x + y;

return (somatr);
}Voilà le fichier DEF:

LIBRARY "DllSimple"
;c_dll_4_vb.def LIBRARY c_dll_4_vb
EXPORTS
somat

Et voilà la declararion dans le VBA d'Excel.:
Declare Function somat Lib "C:\DllSimple.dll" (ByVal x As Integer, ByVal y As Integer) As Integer

ça marche parfaitement dans l'environnement de developpement. J'utilise l'Excel et i fait appel à l fonction et donne le resultat.
PAr contre, si je copie la DLL et je fais la déclaration dans un autre ordinateur, ça ne marche plus. Quelqu'un saurrait me dire pour quoi? Dois-je faire quoi pour que ça marche?

Merci d'avance, 

Otavio Reis
Commenter la réponse de otavioreis
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
0
Merci
C'est As Long, params 16 bits sont du siècle dernier, As Integer est à bannir partout dans VB.

Où est le message d'erreur, il n'y a pas de devin ici.
Si c'est que ne trouve pas ta DLL, suffit de mettre la dll dans dossier du xls et d'un appel SetCurrentDirectory() sur ThisWorkbook.Path dans l'event d'ouverture du classeur xls.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
83
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
4 mars 2008
0
Merci
Dans l'environnement de developpement, Excel affiche correctement le resultat de la fonction.

Hors l'environnement de developpement, Excel met le  erreur sur la celule: #VALEUR!

Il ne trouve pas la DLL, mais le chemin indiqué est correct. Le prob avec le SetCurrentDirectory() sur ThisWorkbook.Path est que je vais être oubligé de poser la DLL dans plusieurs endroit selon les différents fichiers qui vont faire appel, non?

Merci de la reponse,

Otavio Reis
Commenter la réponse de otavioreis
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
0
Merci
Alors tu mets dans le dossier Windows\system32

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
83
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
4 mars 2008
0
Merci
oui, cela a été déjà fait. J'explique le probleme plus en détail:
 - Je compile ma DLL sur une machine virtuel (l'ambiance de developpement du Visual Studio). Je copie la DLL et je la pose sur Windows\system32. J'ouvre l'Excel dans le même ambiance et Excel accède la DLL sans pb.

- Je sors de la machine virtuel (l'ambiance de developpement du Visual Studio), je copie la DLL et je la pose sur Windows\system32. J'ouvre l'Excel et ça ne marche pas. Voilà.

Merci,

Otavio Reis
Commenter la réponse de otavioreis
Messages postés
83
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
4 mars 2008
0
Merci
Vous croyez qu'il y a d'autres fichiers à installer dans d'autres ordinateurs pour qui ça marche?

Otavio Reis
Commenter la réponse de otavioreis
Messages postés
83
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
4 mars 2008
0
Merci
Il manque inclure quelque chose sur le code pour que la DLL soit portable sur d'autres machines?

Otavio Reis
Commenter la réponse de otavioreis
Messages postés
83
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
4 mars 2008
0
Merci
Je crois que j'ai trouvé le pb. Dans la machine où je programme, il y a une dll qui s'appelle MSVCR80D.DLL. Dans les autres machines, il n'y en a pas. Vous savez comment résoudre ça?

Otavio Reis
Commenter la réponse de otavioreis
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
0
Merci
Déja on ne livre jamais un binaire en debug mais en release.

TEMPLATES C/C++ POUR VS 2005
http://www.cppfrance.com/code.aspx?ID=36940
avec ça tu ferais des projets correctement configurés qui te débarrasserait de msvcr80.dll comme de toute autre dépendance.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
83
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
4 mars 2008
0
Merci
Merci bcp, Tu m'as bcp aidé!! J'ai essayé et ça a marché.

Otavio Reis
Commenter la réponse de otavioreis
Messages postés
3
Date d'inscription
dimanche 26 avril 2009
Statut
Membre
Dernière intervention
28 avril 2009
0
Merci
Bonjour,

Je m'aperçois que la dernière réponse date d'il y a plus de 2 ans,
Mais je suis aussi occupé à esayer de faire une dll c++ avec visual studio 2008, et j'ai eu le même problème de portabilité (#valeur) qu'Otavio Reis.
J'ai donc essayé les templates de BruNews. Mais je ne suis pas sûr quel template utiliser pour une dll c++. 
J'ai utilisé cDLL mais j'ai environ 500 erreurs, et l'impression que je suis en train de compiler en C et non en c++.

Quelqu'un peut m'indique un template pour une dll c++ VS2008, correctement portable sur machines avec windowx XP ?
 Sinon comment configurer le projet VS2008 pour que le  .dll généré en release soit portable ?

Merci

Fredo
Commenter la réponse de fbossens
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
0
Merci
Il est clair qu'on doit compiler une dll en C puisqu'on va exporter en mode C (non deco des noms de fonctions). Un peu de cohérence ne nuit pas.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
3
Date d'inscription
dimanche 26 avril 2009
Statut
Membre
Dernière intervention
28 avril 2009
0
Merci
Merci beaucoup pour la réponse rapide,
Mais le code de ma dll (à part la déclaration proprement dite des fonctions) contenant des classes et de la syntaxe spécifiquement c++, j'ai l'impression que le template cDLL que tu proposes ne convient pas, par contre, j'ai fnialement réussi à compiler ma dll sans l'inclure dans le template cDLL, mais en settant l'option suivante (désolé j'utilise vs en anglais):
project-->properties-->c/c++-->code generation--> runtime library : Multi threaded (\MT).
D'après ce que j'ai compris le link est fait statiquement et non dynamiquement. Le  "xxx.dll" créé n'a plus de dépendence et est portable.

Fredo
Commenter la réponse de fbossens