Dll c++ et erreur en vba

Résolu
rniamo Messages postés 16 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 1 mars 2009 - 28 févr. 2009 à 22:21
rniamo Messages postés 16 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 1 mars 2009 - 1 mars 2009 à 23:16
bonjour, j'ai une dll en c++ qui fonctionne parfaitement avec des projets c++.

pour faire simple elle intègre 2 fonctions exportées :

f1() et f2()

- f1() fonction en l'important dans excel
- f2() me renvoie : Erreur d'execution : 2147417848 (80010108 erreur d'automation , l'objet invoqué s'est deconnecté de ses clients)

pour info, les paramètres sont à peu près les mêmes.

20 réponses

rniamo Messages postés 16 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 1 mars 2009
1 mars 2009 à 23:16
ça marche !!

sur un vector je faisait un resize avec en paramètre (un unsigned + 1). Je l'ai casté en int et ça marche ... windows est fantastique. LOL
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 févr. 2009 à 22:29
Penses-tu que les CodeS-Sourciens sont diplomés en grigri africain, en magie vaudou, en météo ou tout autre art divinatoire pour qu'ils donnent un evis sans la moindre ligne de code ???

ciao...
BruNews, MVP VC++
0
rniamo Messages postés 16 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 1 mars 2009
28 févr. 2009 à 23:20
en fait je cherches des indication car je ne comprends pas du tout l'erreur ...

pour le code il est un peu long, c'est pour ça que je ne l'ai pas mis et je ne savais pas s'il fallait le c++ ou pas.

Pour le vba voila :
NB : convRangeEnDouble() convertir un range en tableau de double (c'est juste une boucle).
Private Sub CommandButton_Click()

    Dim r1 As range, r2 As range

    Dim t1() As Double, t2() As Double, t3() As Double

    Dim str As String

    Dim i As Integer, d As Integer
    If textBox1 " " Or textBox2 "" Or textBox3 = "" Then

        MsgBox " redo "

        Exit Sub

    End If

   

    d = CInt(textBox3)+1

    If d < -1 Then

        MsgBox " d "

        Exit Sub

    End If

   

    ReDim t3(d)

    Set r1 = range(textBox1.Text)

    Set r2 = range(textBox2.Text)

   

    t1 = convRangeEnDouble(r1)

    t2 = convRangeEnDouble(r2)

   

    Formulaire.Hide

    i = f2(d, t1(0), UBound(t1) + 1, t2(0), UBound(t2) + 1, t3(0))

    If i > 0 Then  ' pas d'erreur

        str = ""

        For i = 0 To UBound(coef)
            str str & "a" & CStr(i) & " " & CStr(coef(i)) & Chr(10)

        Next i

        MsgBox str

    Else

        MsgBox "erreur : " & i ' erreur :(

    End If

End Sub
0
rniamo Messages postés 16 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 1 mars 2009
1 mars 2009 à 00:23
juste pour dire que le problème se passe lors de l'appel à f2 pour le vba et l'appel au constructeur d'une "matrice" en c++  (voici le code) :

   vector< vector<double> > matrice;
    ...
    if (l) {
        matrice.resize(l);
        if (c) {
            for(int i=0;i<l;i++)
                        matrice[i].resize(c);
        }
    }
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
1 mars 2009 à 10:19
Sachant que du coté VB on a:
Dim t1() As Double, t2() As Double, t3() As Double


et que je présume ces tableaux correctement remplis avant l'appel:
i = f2(d, t1(0), UBound(t1) + 1, t2(0), UBound(t2) + 1, t3(0))


Il faudrait la déclaration que tu mets dans VB:
Declare .... f2(...) As ...
et surtout le but de cette fonction expliqué en PSEUDO code.
Si ce n'est pas une usine à gaz, je trouverai un moment pour la réétudier en C.

ciao...
BruNews, MVP VC++
0
rniamo Messages postés 16 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 1 mars 2009
1 mars 2009 à 10:34
en fait pour expliquer en gros : f2 prend en paramètres d'entrées un entier (d), 2 tableaux (t1 et t2 + leurs tailles) et remplis le tableau t3 à partir de tout ça.

Pour cela je créé une matrice qui a le constructeur ci-dessus et un vecteur colonne (matrice à 1 colonne). Pour ce dernier pas de problème mais pour la matrice rectangulaire ça plante excel.

Voici ma déclaration :

' Wrapper f2

Private Declare Function f2 Lib "maDLL.dll" _

    (ByVal d As Integer, _

    ByRef t1 As Double, ByVal st1 As Integer, _

    ByRef t2 As Double, ByVal st2 As Integer, _

    ByRef t3 As Double) As Integer
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 mars 2009 à 10:55
Si je comprends, le problème est pour générer un tableau exploitable depuis VB.

Si c'est bien cela, jette un oeil sur cet exemple:
GENERATEUR DE TABLEAUX DE NOMBRES POUR VB/VBA
http://www.vbfrance.com/code.aspx?ID=33938
et en ce cas, exit les surcouches (à la con...) du C++, il faut coder vraiment.

ciao...
BruNews, MVP VC++
0
rniamo Messages postés 16 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 1 mars 2009
1 mars 2009 à 11:13
le problème est en C++, mes matrices ne sont accessibles qu'en c++. "les surcouches à la con" est dans ce cas précis la stl donc le à la con ...

je ne vois pas ce qui pose problème dans ce cas précis. Je peux trés bien faire mes allocation avec des new mais c'est moins modifiable (un redim avec delete + new est lourd) ou moins simple (double pointeur  : 1 pour malloc et 1 pour new) et c'est contraire à l'esprit c++ surtout.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 mars 2009 à 11:29
ben c'est pas avec des new, delete, STL ou autre joujou que tu feras un SAFEARRAY qui est la seule structure en mémoire que VB lit comme tableau.

Entre les préceptes des gourous du C++ et la réalité du travail, il y a le moment où il faut admettre le principe de réalité des besoins.

ciao...
BruNews, MVP VC++
0
rniamo Messages postés 16 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 1 mars 2009
1 mars 2009 à 11:38
byref envoie un pointeur, et on accède sans soucis au tableau en connaissant sa taille. De plus le problème n'est pas dans le transfert des données puisque quand la matrice est crée, les données t1 et t2 sont déjà transférés dans des structures c++ et t3 n'est pas encore utilisé.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 mars 2009 à 11:44
Le prob est de savoir si c'est la dll qui crée le tableau T3 et s'il sera ensuite utilisé par VB.
Si oui il faut créer du SAFEARRAY.

ciao...
BruNews, MVP VC++
0
rniamo Messages postés 16 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 1 mars 2009
1 mars 2009 à 18:46
bon j'ai réécris une partie en fasant des allocation "à la main" et j'ai une exception (bad_alloc) sur :

myClass::myClass(unsigned d) : m_ptr(NULL), m_valeurD(d) { // m_valeurD est un unsigned int
    _coefs=new double[m_valeurD+1]; // lève une exception bad_alloc
    throw int(77);
}
0
rniamo Messages postés 16 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 1 mars 2009
1 mars 2009 à 18:51
[HS] on ne peut pas éditer son dernier message ? /HS

en fait les allocation dynamiques dans cette classe ratent si elle ne sont pas constantes :

p=new int[variable]; // rate
p=new int[100]; // réussi

je ne sais pas d'où ça vient et comment contourner le problème ...

concernant les SAFEARRAY, je les utiliserai probablement quand les alloc' marcheront.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 mars 2009 à 18:59
Tu ne feras pas de SAFEARRAY avec les arguties du C++ (new, etc...).
new est un appel masqué, après moult détours, vers HeapAlloc et ce n'est pas possible.
Je t'ai donné un exemple, faut le suivre.

ciao...
BruNews, MVP VC++
0
rniamo Messages postés 16 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 1 mars 2009
1 mars 2009 à 19:11
soit c'est moi soit c'est toi mais un de nous 2 comprends pas (je n'ai peut être pas été assez clair et si c'est le cas je m'en excuse) :

j'ai besoin d'un tableau (d'où le new) mais il n'a rien à voir avec le vba, c'est un tableau de travail si tu veux. Je ne vois aps pourquoi j'utiliserais un SAFEARRAY dans ce cas.
0
rniamo Messages postés 16 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 1 mars 2009
1 mars 2009 à 19:41
en fait si je n'ai toujours pas mis des safearray c'est pour 2 raisons :*

- j'ai des doutes (certainement faux) sur la portabilité
- je ne sais qu'inclure pour les utiliser (j'ai windows.h mais ça ne suffit pas :()
0
rniamo Messages postés 16 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 1 mars 2009
1 mars 2009 à 19:49
bon #define INC_OLE2 manquait. je teste ... mais je veux l'explication du pourquoi je dois utiliser un safearray alors que le tableau ne touche pas aux données du vba
0
rniamo Messages postés 16 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 1 mars 2009
1 mars 2009 à 21:01
après plusieurs manipulation visant à mettre en entrée des SAFEARRAY (c'est plus lisible mais le résultat est le même) je me suis rendu compte que la fonction marchait (safearray ou pas) et que le problème venait certainement du code vba autour (cf mon message du 28/02 à 23h20).

j'ai changé des noms de variable et ça marche ... je ne sais pas vraiment pourquoi ...

en tout cas, [../auteur/BRUNEWS/39449.aspx BruNews], je te remercie pour tes réponses.
0
rniamo Messages postés 16 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 1 mars 2009
1 mars 2009 à 21:10
j'ai trouvé l'erreur : le premier paramètre ! un integer !!
0
rniamo Messages postés 16 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 1 mars 2009
1 mars 2009 à 22:54
voici le problème :

Sub test()

    Dim t1(5) As Double, t2(5) As Double, t3() As Double

    Dim i As Integer, v As Integer

    

    For i = 0 To UBound(x)

    x(i) = -6 + i

    y(i) = x(i) * 2 + 4 + x(i) * x(i)

    Next i

    v = 2

    i = regPoly(x, y, v, coef) 
'     i = regPoly(x, y, 2, coef) 

marche !

    MsgBox tab2String(coef) 
' affiche le tableau

End Sub
0
Rejoignez-nous