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

cs_Argile92 Messages postés 29 Date d'inscription lundi 2 mars 2009 Statut Membre Dernière intervention 30 mars 2009 - 10 mars 2009 à 10:28
cs_Argile92 Messages postés 29 Date d'inscription lundi 2 mars 2009 Statut Membre Dernière intervention 30 mars 2009 - 12 mars 2009 à 09:58
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 mars 2009 à 14:21
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++
0
cs_Argile92 Messages postés 29 Date d'inscription lundi 2 mars 2009 Statut Membre Dernière intervention 30 mars 2009
10 mars 2009 à 14:23
Merci !
C'était un problème au niveau de l'alignement...

++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 mars 2009 à 14:26
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++
0
cs_Argile92 Messages postés 29 Date d'inscription lundi 2 mars 2009 Statut Membre Dernière intervention 30 mars 2009
12 mars 2009 à 09:58
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!
0
Rejoignez-nous