Bibliothèque COM et VB

Résolu
krasnaya Messages postés 8 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 9 mars 2007 - 6 mars 2007 à 16:10
krasnaya Messages postés 8 Date d'inscription mercredi 27 juillet 2005 Statut Membre Derniè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.

De l'aide svp............

13 réponses

krasnaya Messages postés 8 Date d'inscription mercredi 27 juillet 2005 Statut Membre Derniè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!!!
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
6 mars 2007 à 16:29
Oui d'accord, mais c'est quoi le problème exactement ??????

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
krasnaya Messages postés 8 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 9 mars 2007
6 mars 2007 à 16:53
Ben... pour commencer comment faire appel à la DLL??
J'ai ajouté aux références du projet ma DLL. Puis dans le code,  j'ai fait :

Dim obj As Object
obj = CreateObject("MaDLL.Class")

A ce niveau, j'ai une erreur "ActiveX component can't create Object"
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
6 mars 2007 à 18:43
Salut,


Tu peux essayer ça aussi :


Dim obj As new Class


Mais si l'autre plante...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
krasnaya Messages postés 8 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 9 mars 2007
7 mars 2007 à 08:41
J'ai essayé avec cette option là aussi, mais ça ne marche pas non plus!
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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 ...
0
krasnaya Messages postés 8 Date d'inscription mercredi 27 juillet 2005 Statut Membre Derniè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??
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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.


Bref, bon courage...
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #
0
krasnaya Messages postés 8 Date d'inscription mercredi 27 juillet 2005 Statut Membre Derniè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.

Pour le développement de cette DLL, je me suis basée sur cet article de CodeProject : Exposing .Net Components to COM
0
krasnaya Messages postés 8 Date d'inscription mercredi 27 juillet 2005 Statut Membre Derniè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!!!

Any suggestions????
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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).
0
krasnaya Messages postés 8 Date d'inscription mercredi 27 juillet 2005 Statut Membre Derniè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é !
0
Rejoignez-nous