Comment passer une structure contenant un tableau de VB à C ?

cs_TomC Messages postés 42 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 17 mai 2006 - 19 déc. 2005 à 16:59
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 - 24 déc. 2005 à 18:22
Bonjour à tous.
Je cherche à passer une structure de données, contenant un tableau de variant, de VB à C. Voici mon code :

coté VB :
---------

Public Declare Function testStructG Lib "c:\test\test.dll" (s As structG) As Long

Public Type structG
d1 As Double
d2 As Double
d3 As Double
t() As Variant
l() As Variant
s As String
End Type

Sub passageStructure()
Dim s As structG

s12.d1 = 1002.2
s12.d2 = 3210254
s12.d3 = 32.01001
s12.t = Sheets("data").Range("B2:B8").Value
s12.l = Sheets("data").Range("C2:C8").Value
s12.s = "chaîne à passer"
testStructG s12

End Sub

Coté C:
--------

#include <windows.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ole2.h>
#define EXPORT __declspec(dllexport)

typedef struct G{
double d1;
double d2;
double d3;
LPSAFEARRAY t;
LPSAFEARRAY l;
LPSTR s;
}structG;

EXPORT
long WINAPI testStructG( structG * g ){

VARIANT HUGEP * pData, lData;
double d1;
double d2;
double d3;
LPSAFEARRAY t;
LPSAFEARRAY l;
char msg[256];

d1 = g->d1;
d2 = g->d2;
d3 = g->d3;

//affichage des types doubles
sprintf(msg,"%lf,%lf,%lf",d1,d2,d3);
MessageBox (NULL, msg , "DLL Message", 0);


//affichage du tableau t
t = g->t;
sprintf(msg,"%x",&t);
MessageBox (NULL, msg , "DLL Message", 0);
SafeArrayGetUBound(t,1,&nT);
SafeArrayGetUBound(t,2,&mT);
sprintf(msg,"%i x %i",nT,mT);
MessageBox (NULL, msg , "DLL Message", 0);


//affichage du tableau l
l = g->l;
sprintf(msg,"%x",&l);
MessageBox (NULL, msg , "DLL Message", 0);
SafeArrayGetUBound(l,1,&nL);
SafeArrayGetUBound(l,2,&mL);
sprintf(msg,"%i x %i",nT,mT);
MessageBox (NULL, msg , "DLL Message", 0);


//affichage de la chaine de caractère
MessageBox(NULL, g->s, "DLL Message", 0);

hr = SafeArrayAccessData(t,(void HUGEP **)&pData);
if (FAILED(hr)) {
MessageBox (NULL, "Impossible de lire le tableau !" , "DLL Message", MB_ICONHAND);
return -1;
}


return 0;
}

Le problème apparaît à la dernière opération:
" hr = SafeArrayAccessData(t,(void HUGEP **)&pData); "
Visual basic m'indique alors :
Erreur d'execution '10' :
Ce tableau est fixe ou temporairement verrouillé.

Quelqu'un pourrait me filer un tuyau? merci d'avance
(J'ai également posté ce message sur cppfrance.fr)

1 réponse

ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
24 déc. 2005 à 18:22
salut,



il ne faut pas oublier de dévérrouiller le tableau une fois que tu ne l'utilises plus : SafeArrayUnaccessData(t);

ShareVB
0
Rejoignez-nous