IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Crash sur un redim VBA et un appel COM C++


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2013
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 93
    Par défaut Crash sur un redim VBA et un appel COM C++
    J'ai un problème lorsque je dimensionne un tableau dans une structure en VBA puis que j'envoi la structure à une fonction C++. Ça plante direct et impossible de voir quoique ce soit.

    Code C++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    typedef struct XData
    {
    	int Count;
    	SAFEARRAY *X;
    	SAFEARRAY *Y;
    } 	XData;
    typedef struct T
    {
    	BSTR s;
    	XData X;
    } T;
    typedef struct Input
    {
    	SAFEARRAY *X;
    } Input;
     
    __declspec(dllexport) int __stdcall  Cpp_D1(Input *in)
    {
    	return 0;
    }
    code VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Private Declare PtrSafe Function Cpp_D1 Lib "MyDLL.dll" (i As InputData) As Long
     
    Private Type XData
        Count As Long
        X() As Double
    End Type
     
    Private Type T
    	s as string
        X As XData
    End Type
     
    Private Type InputData
        X() As T
    End Type
     
    Sub test()
        Dim i As InputData
        ReDim i.X(5)
        ReDim i.X(0).X.X(10)
        Call Cpp_D1(i)
    End Sub
    Si je ne mets pas le string ça marche.
    Si je ne redimensionne pas i.X(0).X.X(10) ça marche.

    Je suis bloqué sur ce problème depuis plusieurs jours et je ne peux pas utiliser un autre schéma de déclaration de structure (je pense à la déclaration dans le .idl qui marche bien) car je dois avoir une compatibilité sous OS X.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 489
    Par défaut
    Heu, je ne comprends toujours pas pourquoi vous ne voulez pas utiliser l'idl.
    Faut juste vérifier que le code généré par midl soit portable ou le rendre portable, non ?

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2013
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 93
    Par défaut
    Le problème de la portabilité et du côté du vba. Quand je veux utiliser les structures définis côté c++ sur OS X, je reçois un joli message vba "This functionnality is not yet implemented". Du coup, je suis bloqué de ce côté là sous MAC.
    Je veux donc utiliser la double déclaration de la structure (juste pour MAC) car ça marche. Je l'utilise déjà pour des petites structures sans string.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Euh, pourquoi manque-t-il la moitié de ta structure dans la version VBA?

    Surtout pour une structure que tu mets ensuite dans un tableau...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2013
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 93
    Par défaut
    Oups, mauvais copier coller. Désolé. Je corrige ça!
    Pour le cas qui ne marche pas ça n'a pas d'impact car je ne descend pas chercher cette structure côté c++.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Hum...
    Est-ce qu'un truc comme ceci marcherait?
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub SetXDataDimX(ByRef xd as XData, ByVal dimx as Long)
    	ReDim xd.X(dimx)
    End Sub
     
     
    Sub test()
        Dim i As InputData
        ReDim i.X(5)
        SetXDataDimX i.X(0).X, 10
        Call Cpp_D1(i)
    End Sub
    Sinon, il va falloir faire le truc manuellement: Insérer les éléments déjà dimensionnés plutôt que tenter de redimensionner "sur place":
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub test()
    	Dim i As InputData
    	ReDim i.X(5)
     
    	Dim xd As XData
    	ReDim xd.X(10)
    	i.X(0).X = xd
     
    	Call Cpp_D1(i)
    End Sub

    PS: Tes accès aux variables sont bien difficiles à lire, tu devrais donner des noms différents à tes variables:
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Type XData
    	Count As Long
    	X() As Double
    	Y() As Double
    End Type
     
    Private Type T
    	s as string
    	xd As XData
    End Type
     
    Private Type InputData
    	tArray() As T
    End Type
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD-2010] word crash sur l'appel à doc.close
    Par dzincou dans le forum Word
    Réponses: 0
    Dernier message: 12/06/2012, 09h52
  2. [OLE2/ActiveX] Crash sur appel à InvokeHelper
    Par pierre_h dans le forum MFC
    Réponses: 7
    Dernier message: 10/02/2009, 10h51
  3. [VBA-E] Procédure appelée sur clic des boutons de regroupement
    Par truman dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/05/2006, 11h34
  4. [Disques Durs] Prévenir un crash sur un disque dur
    Par Furius dans le forum Composants
    Réponses: 6
    Dernier message: 07/01/2006, 17h04
  5. [VB.NET] Information sur instruction Redim
    Par Aspic dans le forum VB.NET
    Réponses: 4
    Dernier message: 21/12/2005, 19h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo