Accueil > Forum > > > > Comment passer une structure de VB à c
Comment passer une structure de VB à c
jeudi 1 décembre 2005 à 15:58:10 |
Comment passer une structure de VB à c

TomC
|
Bonjour, Tout d'abord je tiens à préciser que je n'ai pas trouvé de réponse complète à mon problème sur internet. (en tout cas je n'arriva pas à l'appliquer :-) ) Je dispose d'une structure en VBA qui est la suivante: Public Type Modele nomModele As String tableau() As Variant loi() As Variant pctPart As Double taux As Double tauxRVNI As Double End Type je la rempli dans mon application en vb. Jusque là tout va bien. Ensuite j'appelle une fonction d'une dll que j'ai créée en passant par référence un modele que j'ai initialisé : methodeRenouvelants(monModele, Resultat) La variable Resultat est passée par référence pour que code VB puisse lire le résultat. Bien entendu, j'ai déclaré ma dll précédemment: Public Declare Function methodeRenouvelants Lib........ Je cherche à récupérer cette structure dans ma dll, mais je bloque un peu. Je ne sais pas trop comment definir ma structure dans le code c, et ce afin que le c récupère tout ca correctement. Précision: J'ai essayé sans structure avec la méthode suivante : methodeRenouvelants(monModele.tableau, monModele.loi, monModele.pctPart, monModele.taux, monModele.tauxRVNI, 0, 0.1, Resultat) et ca fonctionne nickel. L'avantage de cette solution est que je n'ai pas à passer de string (de type BSTR) à la dll. Pour information, je sais qu'il faut récupérer les tableaux de variant par des " LPSAFEARRAY *tableau ". Je sais également qu'il faut récupérer les types "double" de vb par des types "double" de C. Je pense qu'il y a un problème de taille de caractère entre les string de VB et les chaines de c. Mes questions: Comment récupérer la structure dans le code c (en la passant par référence depuis VB bien sur)? D'autre part comment puis-je faire pour passer cette fichue chaien de caractère (nomModele)? pfiouuuu!!! j'savais pas que je pouvais écrire des message saussi longs. J'espère que je en vous ai pas trop soulé.  merci
|
|
jeudi 1 décembre 2005 à 21:33:18 |
Re : Comment passer une structure de VB à c
|
vendredi 2 décembre 2005 à 10:06:50 |
Re : Comment passer une structure de VB à c

TomC
|
Merci pour ta réponse  je vais jeter un oeil et je tiens la communauté au courant. ++
|
|
vendredi 2 décembre 2005 à 11:38:06 |
Re : Comment passer une structure de VB à c

TomC
|
Bon, aprés avoir jeté un coup d'oeil sur tes sources, je n'arrive toujours pas à résoudre mon problème. Je sais passer un tableau de vb à une dll. Je sais aussi passer une chaine de caractère. Par contre je n'arrive pas à passer un double par référence (j'ai retourné le truc dans tous les sens :-) ).
Je récapitule mon problème :
je souhaite passer une instance de la STRUCTURE suivante de VB à ma DLL.
Public Type Modele nomModele As String pctPart As Double taux As Double tauxRVNI As Double tableau() As Variant loi() As Variant End Type
L'instance de cette classe est bien évidemment passée par référence à la dll.
Quelqu'un aurait-il une idée pour le code du coté c ?
je fais un truc qui fait planter mon excel (je code du vba)
typedef struct Modele{ LPSTR nomModele; double pctPart; double taux; double tauxRVNI; LPSAFEARRAY *tableau; LPSAFEARRAY *loi; } MonModele; EXPORT long WINAPI methodeDll( MonModele *lpModele ) { LPSTR nomModele; LPSAFEARRAY *tableau; LPSAFEARRAY *loi; double pctPart; double taux; double tauxRVNI; long nTab,pTab, nLoi, pLoi; VARIANT HUGEP *tabData, *loiData; HRESULT hr; //affectation des champs du modèle// nomModele = lpModele->nomModele; tableau = lpModele->tableau; loi = lpModele->loi; taux = lpModele->taux; tauxRVNI = lpModele->tauxRVNI; pctPart = lpModele->pctPart; //Récupération de la taille des données// SafeArrayGetUBound(*tableau,1,&nTab); SafeArrayGetUBound(*tableau,2,&pTab); SafeArrayGetUBound(*loi,1,&nLoi); SafeArrayGetUBound(*loi,2,&pLoi); //Récupération des données// hr = SafeArrayAccessData(*tableau,(void HUGEP **)&tabData); if (FAILED(hr)) { MessageBox (NULL, "Impossible de lire le tableau !" , "DLL Message", MB_ICONHAND); return -1; } hr = SafeArrayAccessData(*loi,(void HUGEP **)&loiData); if (FAILED(hr)) { MessageBox (NULL, "Impossible de lire la loi de renouvellement !" , "DLL Message", MB_ICONHAND); return -1; } ....... return 0; }
Merci pour l'aide
|
|
vendredi 2 décembre 2005 à 11:52:52 |
Re : Comment passer une structure de VB à c

BruNews
|
Faut réduire la struct pour les tests, fais par exemple une struct avec 2 double et essaie de les relire. Faut procéder étape par étape pour cerner le problème. ciao... [ Lien ]BruNews, MVP VC++
|
|
vendredi 2 décembre 2005 à 14:15:06 |
Re : Comment passer une structure de VB à c

TomC
|
OK c'est ce que j'ai fait. Voici les résultats quand je construis différentes structures: 1 double => fonctionne 2 double => fonctionne 1 LPSTR => fonctionne (equivalent de char *) 2 LPSTR => fonctionne quand je mélange : LPSTR s double d ca foire  Par contre dans l'autre sens double d LPSTR s ca fonctionne!  Je pense que ce doit être lié à la taille de la chaine de caractères que le C ne connaît pas. Bref, la chaîne de caractère est passée par pointeur dans la structure. Par contre je ne sais pas ce qu'il en est du double. Etant donné que je dois rajouter des LPSAFEARRAY ca va être coton  . Je pense mettre ma chaine de caractère à la fin, les doubles au début, et les tableaux au milieu. Ton avis?
|
|
vendredi 2 décembre 2005 à 16:40:37 |
Re : Comment passer une structure de VB à c

TomC
|
Ok
Bon, pour information, j'ai réussi à contourner le problème de la manière suivante (quand je dis problème, je parle du fait que je dois placer mon LPSTR à la fin de ma structure). Ca donne ça : (en epérant que ca servira à quelqu'un un jour... )
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 = "structureG ok" 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); return 0; }
|
|
Cette discussion est classée dans : vb, passer, double, structure, monmodele
Répondre à ce message
Sujets en rapport avec ce message
passage de matrice en vb a une dll c++ [ par brosspro ]
Bonjour,je cherche à passer une matrice sous Excel à une dll.J arrive a faire passer des arguments simples mais pas les matrices.Es t il possible d ap
passer d'un widget a une autre structure [ par khaledtaib ]
bonjourj' ai un petit programme de traitement d'image en language C, que je veux lui creer une interface graphique en GTK+.ce programme doit afficher
string de c++ vers vb [ par ToasTy62 ]
bonjour tlm!bon, g un gros probleme. j'ai créé une dll en c++ ke j'essaie d'utiliser en VB. j'arrive a passer un string de VB vers la dll C++, mé voil
Passer une structure par reference [ par Neo_Fr ]
Neo_Fr
récupèrer une structure avec PostThreadMessage et Peekmessage [ par LaTatadu91 ]
Bonjour, Je cherche à faire communiquer 2 threads ensemble, on ma conseillé sur ce site les fonctions Postthreadmessage et Peekmessage et effectiveme
création de dll sous vb 2005 [ par snowlover18 ]
Bonjour a tous. Alors voila. Je suis débutant en c++ et je dois , pour ma société, rajouter des fonctionnalités (boutons et autre) a un logiciel de ge
Votre avis m'intéresse passer de VB à C++ [ par cuq ]
Bonjour,Je bidouille depuis pas mal de temps en VB et c'est un langage que j'adore. Cela me permet de créer rapidement et facilement des applis .Cepen
Règles d'alignement + structure + fichier [ par visualstar ]
Bonsoir, J'ai fais un p'tit programme qui écris simplement des structures dans un fichier. Puis après je fais le dump du fichier en question et j'aura
Appeler une fonction VB à partir de C++ [ par doggyk ]
Bonjour à tous!Voilà, je souhaiterais appeler une fonction VB à partir d'une DLL C++ (appelée auparavant par mon prog VB).En gros:Démarrage du prog Y
Convertion d'un unsigned long Double en string [ par yves_r ]
Bonjour, J'ai besoin de convertir le résultat d'un calcul en string (char *). Si j'utilise sprintf( s, "%Ld", mon_double), j'obtient une chaine
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|