Problème dll vba C++

loiclm86 Messages postés 21 Date d'inscription dimanche 5 avril 2009 Statut Membre Dernière intervention 3 février 2010 - 20 juil. 2009 à 18:21
loiclm86 Messages postés 21 Date d'inscription dimanche 5 avril 2009 Statut Membre Dernière intervention 3 février 2010 - 21 juil. 2009 à 15:50
Bonjour à tous,

Je souhaite réaliser des programmes ou j'appelle une dll crée via visual studio en C++ pour un client VBA-Excel. J'essaie donc de commencer par un programme tout simple et d'appliquer les tutoriaux que j'ai vu sur internet sur le sujet.

Ici, mon programme VBA va prendre un nombre dans une case excel (7.1 par exemple) et appeler la dll qui va multiplier ce nombre par 2. On veut donc avoir au sortir de la macro VBA le nombre 14.2.....

Je crée donc une console Win32 dans VStudio en mode "dll" vide. Je crée un .cpp qui prend un double en entrée et renvoie cette somme multipliée par 2:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

double multip(double a)
{
return 2*a;
}


Puis je crée un .def:

LIBRARY "projet_test5"
EXPORTS
multip @1

Je compile, j'obtiens un .dll et un .lib au path suivant:
"C:\Documents and Settings\ut15q5\Desktop\prog\projet_test2\debug\projet_test5.dll"



Puis dans Excel, j'écris ceci:

Private Declare Function multip Lib "C:\Documents and Settings\ut15q5\Desktop\prog\projet_test2\debug\projet_test5.dll" _
(ByVal n As Double) As Double

Public Function mult() As Double
mult = multip(Cells(9, 10).Value)
End Function

ET JE RECOIS COMME ERREUR EN VOULANT COMPILER:
"Run Time error '49':
Bad DLL calling convention"

Les arguments sont pourtant bien les mêmes. Qu'est-ce qui ne va pas ?

Merci d'avance!

13 réponses

cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
20 juil. 2009 à 19:25
Ta fonction C n'est pas en stdcall. Pour faire ça, ajoute __stdcall juste après le type de retour de la fonction. Recompile et admire le travail

---
VB.NET is good ... VB6 is better
0
loiclm86 Messages postés 21 Date d'inscription dimanche 5 avril 2009 Statut Membre Dernière intervention 3 février 2010
21 juil. 2009 à 10:37
Ca veut dire quoi qu'une fonction est en __stdcall ?
En tt cas, je change ma fonction en C par:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

double __stdcall multip(double a)
{
return 2*a;
}

comme tu l'indique mais à la compilation, j'ai mtn l'erreur:
"fatal error LNK1168: cannot open C:\(...blabla...)\projet_test5.dll for writing"

Visiblement, c'est un problème de droit d'écriture. Je n'ai jamais vu ça sur visual. C'est étrange ! De plus, hier soir, j'ai essayé la même chose sur code::blocks et j'ai eu le même problème : il y avait le message d'erreur : "permission denied".
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
21 juil. 2009 à 11:01
T'as un programme lancé qui se sert de la DLL ...

---
VB.NET is good ... VB6 is better
0
loiclm86 Messages postés 21 Date d'inscription dimanche 5 avril 2009 Statut Membre Dernière intervention 3 février 2010
21 juil. 2009 à 11:35
pourtant je n'ai que ce workbook d'ouvert+outlook+internet. Je ne vois pas d'où ça vient. ???
0

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

Posez votre question
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
21 juil. 2009 à 11:46
Ferme Excel, connaissant MS, je suis presque certain qu'ils n'appellent pas FreeLibrary quand une erreur se produit

---
VB.NET is good ... VB6 is better
0
loiclm86 Messages postés 21 Date d'inscription dimanche 5 avril 2009 Statut Membre Dernière intervention 3 février 2010
21 juil. 2009 à 12:21
je quitte Excel et je relance... mais tjs le même message...
Excel se lance avec des add-ins et des projets VBA déjà attachés mais je ne pense pas que cela pose problème. Ou bien ?
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
21 juil. 2009 à 12:29
Télécharge Unlocker, après clique droit sur la DLL, clique sur Unlock et ensuite Unlock All. Recompile et ça va aller.

---
VB.NET is good ... VB6 is better
0
loiclm86 Messages postés 21 Date d'inscription dimanche 5 avril 2009 Statut Membre Dernière intervention 3 février 2010
21 juil. 2009 à 13:33
c'est magique... Merci !
C'était quoi alors cette horreur ?
0
loiclm86 Messages postés 21 Date d'inscription dimanche 5 avril 2009 Statut Membre Dernière intervention 3 février 2010
21 juil. 2009 à 13:40
D'ailleurs en changeant un tout petit peu mon programme, je dois réutiliser unlocker pour recomplier. N'y a-t-il pas moyen de faire ça de façon définitive ?
0
loiclm86 Messages postés 21 Date d'inscription dimanche 5 avril 2009 Statut Membre Dernière intervention 3 février 2010
21 juil. 2009 à 13:43
et en plus je dois d'abord quitter excel et le relancer après avoir recompiler sous peine de voir planter excel : pas très robuste comme process. Est-il possible d'éviter tout ça ?
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
21 juil. 2009 à 14:07
Fais une copie de ta DLL stable et fais-la utiliser par ton application VBA uniquement. Comme ça tu peux recompiler ta DLL C tant que tu veux sans être ennuyé. Après, quand tu juges que ta DLL est fonctionnelle, tu écrases la copie.

---
VB.NET is good ... VB6 is better
0
loiclm86 Messages postés 21 Date d'inscription dimanche 5 avril 2009 Statut Membre Dernière intervention 3 février 2010
21 juil. 2009 à 15:07
ok. C'est bien ce que j'avais compris.
Merci en tt cas pour ton aide !
0
loiclm86 Messages postés 21 Date d'inscription dimanche 5 avril 2009 Statut Membre Dernière intervention 3 février 2010
21 juil. 2009 à 15:50
ok. C'est bien ce que j'avais compris.
Merci en tt cas pour ton aide !
0
Rejoignez-nous