Créer une dll pour VB ou VBA

cs_tnabon Messages postés 1 Date d'inscription samedi 17 juillet 2004 Statut Membre Dernière intervention 18 juillet 2004 - 18 juil. 2004 à 17:54
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

16 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 juil. 2004 à 18:03
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++
0
claudenjikam Messages postés 2 Date d'inscription vendredi 1 octobre 2004 Statut Membre Dernière intervention 1 octobre 2004
1 oct. 2004 à 12:02
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 oct. 2004 à 13:14
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++
0
otavioreis Messages postés 82 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 4 mars 2008
11 avril 2007 à 15:08
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
0

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

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 avril 2007 à 15:19
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++
0
otavioreis Messages postés 82 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 4 mars 2008
11 avril 2007 à 15:38
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 avril 2007 à 15:55
Alors tu mets dans le dossier Windows\system32

ciao...
BruNews, MVP VC++
0
otavioreis Messages postés 82 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 4 mars 2008
11 avril 2007 à 16:05
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
0
otavioreis Messages postés 82 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 4 mars 2008
11 avril 2007 à 17:14
Vous croyez qu'il y a d'autres fichiers à installer dans d'autres ordinateurs pour qui ça marche?

Otavio Reis
0
otavioreis Messages postés 82 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 4 mars 2008
11 avril 2007 à 17:29
Il manque inclure quelque chose sur le code pour que la DLL soit portable sur d'autres machines?

Otavio Reis
0
otavioreis Messages postés 82 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 4 mars 2008
11 avril 2007 à 17:50
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 avril 2007 à 19:14
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++
0
otavioreis Messages postés 82 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 4 mars 2008
11 avril 2007 à 20:04
Merci bcp, Tu m'as bcp aidé!! J'ai essayé et ça a marché.

Otavio Reis
0
fbossens Messages postés 3 Date d'inscription dimanche 26 avril 2009 Statut Membre Dernière intervention 28 avril 2009
27 avril 2009 à 22:17
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 avril 2009 à 23:13
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++
0
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
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
0
Rejoignez-nous