Ocx IAVB

 

Créer un vrai Ocx en DotNet 1

Utiliser le modèle "Classe COM" (template) pour VB 2008. 1

Adapter votre projet pour en faire une dll ActiveX en DotNet 1

Créer en VB6 un Ocx utilisant la dll ActiveX en DotNet 2

Utiliser l'Ocx en VB6 : ClientVB6. 2

Conclusion. 3

 

Créer un vrai Ocx en DotNet

 

A ma connaissance, il n'est pas possible de créer un vrai Ocx directement en DotNet : j'entends par "vrai" Ocx un contrôle ActiveX que l'on peut insérer partout, exactement comme ceux que l'on faisait par exemple en VB6. Par contre on peut créer une dll ActiveX en DotNet, qui ne pose pas de difficulté à être intégrée dans un projet VB6, mais guère plus : elle n'a pas d'interface utilisateur, et ne peut donc pas s'insérer dans l'ensemble des conteneurs ActiveX, qui sont innombrables. La solution est donc là : il suffit de faire un Ocx en VB6 qui utilise notre dll ActiveX en DotNet, c'est tout !

 

Voici les étapes pour y arriver sans problèmes :

 

Utiliser le modèle "Classe COM" (template) pour VB 2008

Il ne fait pas grand chose, mais permet de fabriquer des identifiants uniques (qu'il serait hasardeux de faire à la main, pour des questions d'unicité lorsque l'on distribue le composant sur toute la planète !).

Le modèle "Classe COM" n'est pas installé par défaut avec Visual Basic 2008 Express, mais il est téléchargeable ici (cf. vbfusion05.exe, il est déjà inclus dans le zip IAVB) :

www.microsoft.com/france/msdn/vbasic/Appel-DotNET-Framework-a-partir-d-applications-Visual-Basic-6.mspx

Copier le fichier \ModeleActiveX_VB2008\ComClass.zip

dans le dossier : \Mes documents\Visual Studio 2008\Templates\ItemTemplates\Visual Basic\

Ensuite il suffit d'ajouter une classe de type "Classe COM" à votre projet pour récupérer les identifiants et la structure du code source (on peut ensuite supprimer cette classe).

 

Adapter votre projet pour en faire une dll ActiveX en DotNet

En regardant en détail le code source de la classe ComClass1.vb, vous avez le minimum des actions à faire pour transformer votre projet en dll ActiveX : il suffit alors d'ajouter des propriétés et fonctions publiques pour pouvoir les appeler de l'extérieur.

 

Exemple :

 

Public Function strCommuniquer$(ByVal strEntree$)

    strCommuniquer = ""

    If String.IsNullOrEmpty(strEntree) Then Exit Function

    IAVBMain(strEntree)

    If String.IsNullOrEmpty(Me.m_sReponse) Then Exit Function

    strCommuniquer = Me.m_sReponse

End Function

 

Si on ne veut pas exposer une fonction publique via Com, on peut la masquer via un attribut :

 

' Masquer cette fonction à Com ActiveX car on exporte déjà strCommuniquer

<Runtime.InteropServices.ComVisible(False)> _

Public Sub IAVBMain(ByVal sEntree$)

 

L'Ocx est une version simplifiée d'IAVB, elle n'implémente pas toutes les propriétés disponibles dans la région "Interface".

 

Dans AssemblyInfo.vb, il faut trois conditions : AssemblyFileVersion doit être renseigné, ComVisible doit être à True (ou sinon il doit y avoir au moins une fonction publique exposée à Com via l'attribut ComVisible), et le Guid doit être renseigné :

 

<Assembly: AssemblyFileVersion("3.1.0.0")>

<Assembly: ComVisible(True)>

<Assembly: Guid("1304f12e-d6c0-44fd-b403-14e2bb503563")> (exemple de Guid)

 

Créer en VB6 un Ocx utilisant la dll ActiveX en DotNet

Pour pouvoir référencer la dll ActiveX en VB6, il faut la mettre dans le GAC. Pour cela, elle doit donc être signée : en VB 2008, il suffit simplement de cliquer sur l'onglet Signature du projet LibIAVB (Lib pour Librairie IAVB), et de créer une nouvelle signature, c'est tout.

 

Note : à ce stade on peut faire un projet client en DotNet pour tester la dll ActiveX, avec l'avantage du mode debug : si cela ne fonctionne plus après avoir modifié la dll, il suffit de recréer une nouvelle signature (et ne pas oublier non plus de définir comme projet de démarrage le projet client et non la dll. Exemple de disfonctionnement : plantage général, aucun point d'arrêt ne peut plus être atteint, ... c'est un peu le revers de la médaille d'une dll ActiveX).

 

Une fois la dll signée et copiée dans le répertoire \VB6OCX, on peut lancer GAC.bat qui va se charger d'enregistrer la dll ActiveX dans le GAC, et de faire une tlb (Type LiBrary : librairie de type) : c'est cette tlb qu'il faut référencer dans le nouveau projet VB6 de type "Contrôle ActiveX". Le code source de cet Ocx est très simple :

 

Option Explicit
 
Dim iavb As New clsIAVB
 
Private Sub UserControl_Initialize()
    iavb.Initialiser
End Sub
 
Public Function strCommuniquer$(strEntree$)
    strCommuniquer = iavb.strCommuniquer(strEntree)
End Function
 
Private Sub cmdTest_Click()
    lblReponse.Caption = strCommuniquer(tbEntree.Text)
End Sub

 

Ici l'interface ne sert que pour tester l'Ocx : pour vérifier que le contrôle ActiveX est bien présent dans la liste des contrôles ActiveX avec interface, et qu'il fonctionne bien directement depuis l'interface. On peut cacher cette interface au profit de l'interface du projet final.

 

Note : pour le fichier GAC.bat j'ai inclus les utilitaires du framework DotNet (2.0.50727) dans le zip pour faciliter l'installation sous Windows XP (le cas échéant, remplacez-les si votre configuration est incompatible, les chemins sont précisés dans le fichier batch).

 

Utiliser l'Ocx en VB6 : ClientVB6

Enfin, pour tester l'Ocx, par exemple dans un projet client VB6, il suffit d'ajouter le composant via le menu Projets : Composant... : puis de sélectionner le composant "Controle ActiveX pour le moteur IAVB en DotNet" ou bien de parcourir le fichier IAVB.ocx, c'est équivalent.

Il suffit ensuite de placer le composant ucIAVB (uc pour UserControl : contrôle utilisateur) sur une feuille VB6. On peut alors tester l'Ocx directement depuis son interface, ou bien alors via un textBoxEntree et un LabelReponse :

 

Me.lblReponse.Caption = Me.ucIAVB1.strCommuniquer(Me.tbQuestion.Text)

 

Conclusion

Cet exemple est fourni a titre de démonstration : si vous voulez créer votre propre composant Ocx, refaite la procédure en entier, sans réutiliser les identifiants globaux, ni le fichier .snk, de façon à éviter la confusion entre vos développements et les miens, au cas où distribueriez votre composant (pour info. je n'utilise jamais de signature, et tous mes logiciels DotNet sont fournis avec le code source sur VBFrance, et je ne fait plus de VB6 : on ne peut donc pas me rendre responsable d'un logiciel qui serait soi-disant signé par moi-même).