cs_TomC
Messages postés42Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention17 mai 2006
-
1 déc. 2005 à 15:58
cs_TomC
Messages postés42Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention17 mai 2006
-
2 déc. 2005 à 16:40
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é.
Jette aussi un oeil ici pour les tableaux:
GENERATEUR DE TABLEAUX DE NOMBRES POUR VB/VBA
http://www.vbfrance.com/code.aspx?ID=33938 Le code de la dll est dans un txt joint, il y a un peu d'asm mais ce sont les algos de génération des nombres, pas obligé de t'y arrêter.
cs_TomC
Messages postés42Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention17 mai 2006 2 déc. 2005 à 11:38
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)
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;
}
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 2 déc. 2005 à 11:52
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.
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.
cs_TomC
Messages postés42Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention17 mai 2006 2 déc. 2005 à 16:40
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