Dll c++ et erreur en vba [Résolu]

Signaler
Messages postés
16
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 mars 2009
-
Messages postés
16
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 mars 2009
-
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.
A voir également:

20 réponses

Messages postés
16
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 mars 2009

ç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
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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++
Messages postés
16
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 mars 2009

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
Messages postés
16
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 mars 2009

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);
        }
    }
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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++
Messages postés
16
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 mars 2009

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
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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++
Messages postés
16
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 mars 2009

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.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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++
Messages postés
16
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 mars 2009

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é.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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++
Messages postés
16
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 mars 2009

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);
}
Messages postés
16
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 mars 2009

[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.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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++
Messages postés
16
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 mars 2009

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.
Messages postés
16
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 mars 2009

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 :()
Messages postés
16
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 mars 2009

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
Messages postés
16
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 mars 2009

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.
Messages postés
16
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 mars 2009

j'ai trouvé l'erreur : le premier paramètre ! un integer !!
Messages postés
16
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
1 mars 2009

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