begin process at 2012 05 29 01:02:17
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

lundi 19 décembre 2005 à 16:56:19 | Comment passer une structure contenant un tableau de VB à C ?

TomC

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


mardi 20 décembre 2005 à 17:26:42 | Re : Comment passer une structure contenant un tableau de VB à C ?

TomC

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


Cette discussion est classée dans : dll, tableau, d1, msg, double


Répondre à ce message

Sujets en rapport avec ce message

Utiliser un tableau de double en retour d'une DLL pour VB6 [ par les french texans ] Bonjour, je vais essayer d'etre claire.J'ai un programme en VB6 (qui marche normalement) qui a un tableau de double :"Dim picture_array(0 To 310, 0 To Dll + LoadLibrary [ par Manson ] Salut,voila, j'ai fais une dll dont le code est le suivant :void __declspec(dllexport)show_msg(HWND hWnd, char *msg){ MessageBox(hWnd, msg, "Dll Powa Ecriture d'une dll atl [ par ultraLek ] Bonsoir à tous, voila mon problème j'ai actuellement une source c++ 7 qui fonctionne sous forme d'un exécutable appelable en ligne de commande, son bu Aide [ par eikonos ] Je travail sur une dll appellé psfg.dllj'ai ces lignes suivant de codetypedef struct CAMERAPARAM_tag{int nGain;int nOffset;int bOffsetFix;int nUpperLi DLL C++ [ par alonsyl ] Bonjour,Je travaille en Visual Basic et j'essaie de créer une DLL C++ afin d'effectuer du calcul matriciel. Pour l'instant, je commence petit avec la renvoyer un tableau avec une dll en c++ [ par cedric1981 ] Bonjour à tous,voila mon probleme,j'ai crée un dll en c++ que j'utilise dans mon programme visual basic et maintenant je souhaiterais que la fonction Passage de tableau en paramètre dans une dll [ par makefcna ] Bonjour,Je souhaite passer un tableau de int comme paramètre d'une procedure dans une dll :void mafonction(int* tableau[]){tableau[1]=5tableau[2]=10}J Petit problème avec un pointeur et un simple appel de fonction... [ par n_o_u_n_o_u ] Bonjour,Je suis actuellement en train de découvrir la notion de pointeurs et je rencontre un petit problème avec le code ci-dessous.L'adresse du table Tableau tridimensionnel global [ par nisaloncaje ] bonjour dans mon programme j'aurais besoin d'utiliser un tableau à 3 dimensions (double tab[2][2][1433]) comme variable globale. Ainsi, dans les fichi cosinus d'un tableau en c++ [ par keno83 ] Bonjour, je rencontre un probleme en ce moment: j'essaie de faire un cosinus d'un tableau comme ci dessous: cos(V[i+size/2]*(past/Eo)) Et a la compila


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,338 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales