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:56
cs_TomC Messages postés 42 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 17 mai 2006 - 20 déc. 2005 à 17:26
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

1 réponse

cs_TomC Messages postés 42 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 17 mai 2006
20 déc. 2005 à 17:26
Rectification:
En réalité, mon tableau (dynamique a priori) est bien passé dans la structure, et je peux récupérer sa taille. Le problème vient en réalité du fait que le tableau est verrouillé (par vb je pense). Je cite VBEditor :
Erreur d'execution 10
Ce tableau est fixe ou temporairement verrouillé

Bon ok il est verrouillé, je suis d'accord, mais je me pose 2 questions:

Comment le déverrouiller?
J'arrive à passer le tableau (qui est bien dynamique) sans structure, en le mettant en paramètre de ma fonction. Comment cel ase fait-il que dans ce cas je ne me fasse pas insulter???

Merci pour les informations
0
Rejoignez-nous