Déclaration Type VB / Struct C++, DLL

Signaler
Messages postés
29
Date d'inscription
lundi 2 mars 2009
Statut
Membre
Dernière intervention
30 mars 2009
-
Messages postés
29
Date d'inscription
lundi 2 mars 2009
Statut
Membre
Dernière intervention
30 mars 2009
-
Bonjour à tous,

J'ai crée une DLL C++, exécutable via VB.

Dans VB, j'ai une TYPE que je passe en argument via un SAFEARRAY pour qu'il soit exploitable dans C++.

Néanmoins, je rencontre un problème récurrent...

Lorsque j'initialise mon Type (dans Vb) et qeu je le fais passer dans ma DLL, mon Struct correspondant (dans C++) est mal initialiser..
Je m'explique: certaines valeurs sont "inversées" et d'autre ne sont même pas initialiser, alors que mon Type et mon Struct sont définis de la mêm façon.

J'ai souvent rencontré ce problème, sans jamais trouver une solutions efficace.

Merci de votre aide.

4 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Type de VB est struct en C.
On passe l'adresse d'une structure (ByRef) depuis VB et comme normal en C on reçoit pointeur de struct.
Une struct (Type) n'a donc rien à faire dans un SAFEARRAY.

Attention de bien aligner les membres de struct pour qu'ils correspondent en mémoire entre C et VB.
Integer = short
Long = int ou long
etc...

ciao...
BruNews, MVP VC++
Messages postés
29
Date d'inscription
lundi 2 mars 2009
Statut
Membre
Dernière intervention
30 mars 2009

Merci !
C'était un problème au niveau de l'alignement...

++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Parmi d'autres, exemple ici:
http://www.vbfrance.com/codes/TEMPS-PROCESSEURS-TOTAL-UNITE-API-NATIVE_42918.aspx
Voir Class_Initialize() dans fichier ClsCpuPerf.cls

ciao...
BruNews, MVP VC++
Messages postés
29
Date d'inscription
lundi 2 mars 2009
Statut
Membre
Dernière intervention
30 mars 2009

Sorry de t'embeter, mais je rencontre à nouveau (pour une raison obscure) le même problème.

J'envoie un Liste de Struct depuis VB que je récupère via un SAFEARRAY dans C++.
Pour 2 classes, aucun problèmes, tout marche
Mais je viens d'en créer une 3e, et certaines valeurs ne correspondent pas.

Je dois donc faire quelque chose de mal, mais je n'arrive pas à voir quoi...

Ci-dessous le Type VBA:

Type Resultats
    Dates_() As String          'Tableau des dates
    Perf_() As Double           'Tableau des perf
    Track_() As Double          'Tableau des tracks
    Track100_() As Double       'Tableau des Track d'une stratégie à 100%
    Perf100_() As Double        'Tableau des Perf du Track 100%
    MaxDD_ As Double            'Maximum DrawDown (plus grosse perte)
    MaxDD100_ As Double         'MaxDD du Track 100%
   
End Type

Ci-dessous, le Struct C++:

struct Resultats
{
SAFEARRAY* Dates_;
SAFEARRAY* Perf_;
SAFEARRAY* Track_;
SAFEARRAY* Track100_;
SAFEARRAY* Perf100_;
double MaxDD_;
double MaxDD100_;
};

Ci-dessous, mon appel de fonction VB :

Declare Sub CombienRes Lib "P:\Documents\BT.dll" (ByRef ListeResultat() As Resultats)

Et enfin ci-dessous, ma fonction C++:

void _stdcall CombienRes (SAFEARRAY** ListeResultat)
{
// Accès aux données
Resultats *res;
SafeArrayAccessData(*ListeResultat,(void**)&res);

Voilà, pour deux fonction différentes ça marche parfaitement, mais cette fois-ci, mes données ne correspondent pas entre VB et C++...

Merci pour votre temps et pour votre aide, car cette erreur (récurrente) me rend fou!