krasnaya
Messages postés8Date d'inscriptionmercredi 27 juillet 2005StatutMembreDernière intervention 9 mars 2007
-
6 mars 2007 à 16:10
krasnaya
Messages postés8Date d'inscriptionmercredi 27 juillet 2005StatutMembreDernière intervention 9 mars 2007
-
9 mars 2007 à 17:23
Bonjour,
voilà deux jours que je parcours le net sans résultats !!!!!
C'est la première fois que je développe en vb et je suis perdue !!
J'ai une DLL développée avec .NET et j'ai besoin d'accèder aux fonctions de cette DLL à partir d'une application VB6.
J'ai pu accèder à ma DLL via une appllication C++, mais je suis bloquée avec VB.
krasnaya
Messages postés8Date d'inscriptionmercredi 27 juillet 2005StatutMembreDernière intervention 9 mars 2007 9 mars 2007 à 17:23
et le tour est joué !!!
J'ai changé les tableaux out en ref , et en VB6, j'ai déclaré des tableaux dynamiques :
Dim arr() As string
Redim arr(0 To 0)
Dans la DLL, j'ai réalloué le tableaux avec une nouvelle dimension.
Comme ça, la dll MARCHE!!!
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 7 mars 2007 à 10:13
Bah à part un défaut de conception de la classe COM, je vois pas... L'explorateur d'objet de VB l'affiche correctement ?
C'est moche, mais si tu taquine un peu le C++, tu peux faire une dll
classique en stdio qui appel elle même la dll la COM. Dans VB tu
pourras utiliser du private/public declare function ...
krasnaya
Messages postés8Date d'inscriptionmercredi 27 juillet 2005StatutMembreDernière intervention 9 mars 2007 8 mars 2007 à 10:26
Voilà ce qu'il y a de neuf :
- j'ai ajouté ma DLL aux références du projet
- j'ai déclaré un Objet MaDLL.Class
- j'ai instancié l'objet avec Set Objet = New MaDLL.Class
Jusque là c'est bon. Mais l'appel aux méthodes echoue !!!
Pour une première méthode qui retourne un Long et un tableau de String, j'ai cette erreur :
Run Time error '-2147417848(80010108)
Method 'MaMethode' of object '_Class' Failed
Pour une deuxième méthode qui prend en argument un tableau de Long, j'ai une erreur de compilation :
Compile error:
Function or interface marked as restricted, or the function uses an Automation type not supported in Visual Basic.
Je n'y comprends rien!!!!! A priori, je dirais que le problème vient de ma DLL... Mais comment elle peu marcher avec une application C++ alors??
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 8 mars 2007 à 12:53
Soucis de compatibilité apparement... Les tableaux ne sont pas des
simples tableaux en VB6 par exemple. Il y a des octets utilisés avant
les valeurs qui stockent le nombre de dimension du tableau et le nombre
de cases dans celle-ci... Les strings ont certainement des représentations différentes aussi.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 8 mars 2007 à 13:36
Attention aussi aux formats des données.
Un long en .Net est codé sur 8 octets (64bits) alors que en VB6 il est codé sur 4 octets (32 Bits)
[Pour ce qui suit, je me refere à une dll dévolepée en VC6 et utilisée en VB6]
Passer un tableau de nombre ne pose pas de problème, faut juste garder en memoire que le tableau est stocké en mémoire par colonnes (toutes les lignes de la 1ere colonne, puis toutes les lignes de la seconde, ...)
Passer une chaine ne pose pas de problème, àa condition de savoir ce que attend la dll. Si elle attend une chaine de type LPSTR il faut passer la chaine par valeur, par contre si c'est un pointeur sur un LPSTR qui est attendu, la chaine doit etre passer par référence. Attention en .Net ou il va falloir faire du marshaling dans la dll. Dans les 2 cas c'est un pointeur qui est passé, mais un pointeur est un long donc 4 octets en VB6 mais 8 octets en .Net
Pour les structures, il faut faire attention à ce que dans la dll, toutes les variables soient stockées alignées sur 4 octets. Car en VB6 un byte (1 octet) ou un integer ou short (2 octets) prennent 4 octets en mémoire. EN VC6, il faut penser à spécifier le parametre de compilation /Zp4 pour les structures pouvant venir de VB.
Pour les tableaux de chaines de caractères ou de structures, les choses se compliquent beaucoup. Un tableau de chaine ou de structures en VB n'est pas un simple tableau, c'est en fait une structure complexe. Elle correspond au type SAFEARRAY en VC6 et est loin d'etre évidente à mettre en oeuvre.
Donc pour utiliser une dll .Net en VB6, il faut faire attention aux types de données qui ont changé, faire du marshaling lorsque c'est des pointeurs qui sont attendus, ......
Un lien vers un document peut-etre interessant, même s'il n'a pas un lien franchement direct avec le problème :
Consommer un objet VB2005 avec VB6
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
krasnaya
Messages postés8Date d'inscriptionmercredi 27 juillet 2005StatutMembreDernière intervention 9 mars 2007 8 mars 2007 à 14:47
Dans la DLL développée en C#, toutes les fonctions ont cette signature :
int Mafonction ( int[] TabInt, out int RetVal, out string[] RetTab)
Depuis VC6, les types int et tableau de string sont transformés respectivement en long et en SAFEARRAY; en VB6 en Long et String().
D'après ce que j'ai appris dans mes recherches sur l'interopérabilité managé/non managé, c'est le CCW (COM CallableWrapper) qui prend en charge la conversion des types entre code managé et codes non managés.
krasnaya
Messages postés8Date d'inscriptionmercredi 27 juillet 2005StatutMembreDernière intervention 9 mars 2007 9 mars 2007 à 12:15
Je suis arrivée à cerner le problème : c'est les tableaux !!!!
j'ai testé des fonctions qui prennent des paramètres in et out simples (int et string), ces fonctions marchent!
Mais dès que j'ai essayé de passer à une fonction un tableau en tant que paramètre in, j'ai eu droit à l'erreur de compilation citée ci-dessus!!!
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 9 mars 2007 à 13:11
Tu peux faire passer les tableaux éléments par éléments... Mais ça
risque d'être très long de façon proportionnelle à la taille du
tableau. (Style GetFirst puis GetNext tant qu'il renvoie une valeur).
krasnaya
Messages postés8Date d'inscriptionmercredi 27 juillet 2005StatutMembreDernière intervention 9 mars 2007 9 mars 2007 à 14:20
Je ne pense que ce soit la bonne solution!!!
une solution existe sûrement, il suffit de la trouver !
Moi j'ai fait un autre petit pas et j'en suis super heureuse !
J'ai réussi à faire passer à une fonction de ma dll un tableau. Tout ce que j'ai eu à faire c'était ajouter le mot clé ref dans la définition de la fonction. C'est cet article: using COM Callable Wrapper to extend existing Visual Basic 6.0 applications qui m'a donné la solution!
Il ne reste plus que les paramètres out , et le tour est joué !