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 