IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

[MVSE 2008 - VBA 2007] - Créer une DLL VBNet et l'utiliser dans une macro VBA


Sujet :

VB.NET

  1. #21
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Essai dll
    Citation Envoyé par Golard Voir le message
    En référence à ton post #12, as-tu essayer d'exploiter mon fichier .dll plutôt que de régéner la solution ?
    Cela permettrait de valider que la dll créer par Visual studio express est bien capable de communiquer à travers COM !
    J'ai pris ta dll fourni dans le post 11 (mon antivirus la trouve ok)
    Citation Envoyé par Golard Voir le message
    Pour qu'il n'y ait aucun doute, je te joins la solution de la classe: Pièce jointe 154326
    Enreg avec regasm (32 bits sur mon système)
    D:\data\aide\test>regasm alarmes.dll
    Microsoft (R) .NET Framework Assembly Registration Utility version 4.**** pour Microsoft .NET Framework version 4.****
    Copyright (C) Microsoft Corporation 1998-2004. Tous droits réservés.

    Inscription des types réussie
    Ajout de la réf dans excel avec ton tlb : ok.
    Test : ok. La fenêtre s'ouvre.

    Tu devrais essayer d'enregistrer avec regasm version 32 bits.

    Après il faut voir avec windows 7 qu'elles peuvent être les différences. (là je ne peut pas d'aider)
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  2. #22
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour

    Citation Envoyé par Golard Voir le message
    On avance !

    J'utilise à présent le Regasm.exe présent dans C:\Windows\Microsoft.NET\Framework64\v4.0.30319
    J'ai choisi celui-ci car je suis sous seven 64 bits ... est-ce bien ce qu'il faut faire ?
    Est-ce que le xlsm ne fonctionnera ensuite que pour des postes 64 bits ???
    Je ne peux pas le jurer, mais je suis sceptique. Pour ainsi dire, je ne suis jamais passé à l'acte. Je pense que tu vas devoir creuser un peu. Une macro Excel (ou même une macro Word, Powerpoint etc...) a besoin d'une application-hôte. C'est la version d'Office qui va utiliser la dll qui compte plus que la version du système d'exploitation.

    À mon avis, c'est comme pour un complément COM. Un Office à 64 bits a besoin d'une dll à 64 bits et un Office a 32 bits a besoin d'une dll à 32 bits.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  3. #23
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 281
    Points : 289
    Points
    289
    Par défaut
    Merci pour toutes vos idées !
    Je crois que sans vous je sombrerais lentement en dépression

    J'ai bien noté toutes vos idées, notamment

    Citation Envoyé par rv26t Voir le message
    J'ai pris ta dll fourni dans le post 11 (...)
    Enreg avec regasm (32 bits sur mon système)
    Ajout de la réf dans excel avec ton tlb : ok.
    Test : ok. La fenêtre s'ouvre.
    A priori le code de ma dll du post #11 serait valable puisqu'il marche chez rv26t sous Office 2007...
    Donc on serait bien face à un problème d'enregistrement de la dll sur le poste

    Citation Envoyé par rv26t Voir le message
    Tu devrais essayer d'enregistrer avec regasm version 32 bits.
    J'ai essayé et j'obtiens l'erreur "Erreur Automation Le fichier spécifié est introuvable" (au lieu de l'erreur 429 un composant ActiveX ne peut pas créer l'objet)...
    MAIS je commence à douter du désenregistrement correct de mes dlls (je vous en parle plus bas)

    Citation Envoyé par clementmarcotte Voir le message
    À mon avis, c'est comme pour un complément COM. Un Office à 64 bits a besoin d'une dll à 64 bits et un Office a 32 bits a besoin d'une dll à 32 bits.
    J'ai bien noté la subtilité : l'enregistrement de la dll en 32 ou 64 bits ne serait pas imposé par l'environnement de développement 32 ou 64 bits (seven 64 bits dans mon cas), mais par la version d'office qui exécutera le fichier excel .xlsm (version Office 2007 32 bits dans mon cas)

    Citation Envoyé par rv26t Voir le message
    Relance sur le forum vb6 (en indiquant le lien ici), il me semble qu'un des intervenants connait bien ce type de problème.
    Je vais suivre ton conseil, MAIS avant, pour ne pas vous faire perdre votre temps, je souhaite refaire une batterie de test propre.

    En effet, ce matin, j'ai l'impression que je me mélange un peu (beaucoup ).

    DEMANDE D'AIDE 1

    Pour commencer, je pense que j'ai un problème pour désenregistrer correctement mes dlls. Pourriez-vous m'aider ?
    J'aimerais repartir sur une base saine et j'aimerais "nettoyer" tous les enregistrements faits auparavant.
    Pourtant je pense avoir pris soin de toujours exécuter Regasm Alarmes.dll /u avant de faire un nouveau test, mais plusieurs dll restent présentes dans la liste des références proposées sous excel:
    Nom : RéférencesVBA1.png
Affichages : 294
Taille : 31,4 Ko
    Nom : RéférencesVBA2.png
Affichages : 348
Taille : 29,8 Ko

    Regasm Alarmes.dll /u reste sans effet.
    Un nettoyage de la base de registre par CCleaner est sans effet.
    Comment faire ???

    DEMANDE D'AIDE 2

    Ensuite j'ai du mal à analyser la différence de codage entre mon exemple post #1 et la version light de rv26t post #9

    Dans le premier cas (post #1), la classe contient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <ComClass(Alarme.ClassId, Alarme.InterfaceId, Alarme.EventsId)> _
    Public Class Alarme
     
        Implements IAlarmes 
    (...)
    et le code VBA fait un Set de la classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private monAlarme As Alarmes.Alarme ' la classe vb.net
    Private monAlInt As Alarmes.IAlarmes ' l'interface pour vb6
     
    ' programmation classique (miracle)
    Sub Bouton2_Clic()
     
    Set monAlarme = New Alarmes.Alarme ' implémente la classe alarme (nous avons un objet alarme)
    Set monAlInt = monAlarme ' récupère l'interface à partir de l'objet alarme
    (...)
    Dans le second cas (post #9), la classe contient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> Public Interface IAlarmes
      Sub GestAlarme()
    End Interface
    <ClassInterface(ClassInterfaceType.None)> _
    Public Class InterfaceAlarme
      Implements IAlarmes ' contrat entre classe et interface.
     
      Private fenAlarmes As frmAlarmes = New frmAlarmes
     
        ''' <summary>Ouvre la fenêtre des alarmes.</summary>
      Public Sub GestAlarme() Implements IAlarmes.GestAlarme
          fenAlarmes.Show() 'fenAlarmes.ShowDialog()
        End Sub
     
    End Class
    et le code VBA fait un Set de l'INTERFACE de la classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private monAlarme As Alarmes.InterfaceAlarme  ' la classe vb.net
     Private monAlInt As Alarmes.IAlarmes ' l'interface pour vb6
     
    Sub dllvbnet()
     
    Set monAlarme = New Alarmes.InterfaceAlarme ' implémente la classe alarme (nous avons un objet alarme)
    ' monAlarme pourrait être utilisé directement
    Set monAlInt = monAlarme ' récupère l'interface à partir de l'objet alarme (permet d'avoir l'Intellisense ce qui est très pratique)
    Call monAlInt.GestAlarme  ' appele la sub
    (...)
    J'ai peur d'avoir parfois mélangé les 2 versions de code VBA...
    Alors qu'à priori il s'agit de 2 méthodes bien distinctes.

    DEMANDE D'AIDE 3

    Enfin je viens de découvrir un "attribut" accessible dans Visual Basic Express 2008, pour CHAQUE Public Class présent dans le module de classe:
    COM Class (Expose Class to COM) qui actuellement est à False
    Le passage à True de cet attribut ajoute automatiquement un préfixe de type <ComClass à la classe, donc semble incompatible avec la version de rv26t.
    Avez-vous connaissance de cet attribut de la version express ?
    Savez-vous comment l'utiliser ?


    Je compte refaire le point sur tout ça le plus rapidement possible (mais ce week-end va être assez chargé...)

    Merci d'avance pour votre lecture de tous ces points!!!

    Développement VBNet sous Visual Studio Community 2013 (environnement Windows 10)

  4. #24
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par Golard Voir le message
    Merci pour toutes vos idées !
    Je crois que sans vous je sombrerais lentement en dépression

    J'ai bien noté la subtilité : l'enregistrement de la dll en 32 ou 64 bits ne serait pas imposé par l'environnement de développement 32 ou 64 bits (seven 64 bits dans mon cas), mais par la version d'office qui exécutera le fichier excel .xlsm (version Office 2007 32 bits dans mon cas)

    Merci d'avance pour votre lecture de tous ces points!!!
    Non, c'est plus que cela. C'est à l'origine de tout le processus. Pour un Office à 32 bits, il faut compiler en 32 bits uniquement (x86). Pour un office à 64 bits, il faut compiler en 64 bits. Et puis, sauf horreur de ma part, Office 2010 a été la première version d'Office disponible en 64 bits.

    Donc, pour office 2007 et avant, il faut Compiler en 32 bits et enregistrer en 32 bits.

    Pour "couvrir entièrement" Office 2010 et suivants, il faut les deux. Complètement 32 bits et complètement 64 bits. Je dirais même que pour Office, il faut éviter anycpu.

    Il y a une citation très éloquente sur cette page:

    http://msdn.microsoft.com/en-us/libr...nCompatibility


    ActiveX Control and COM Add-in Compatibility


    --------------------------------------------------------------------------------



    Existing 32-bit ActiveX controls, both third-party and Microsoft-supplied, are not compatible with the 64-bit version of Office 2010. For ActiveX controls and COM objects, there are three possible solutions:

    •If you have the source code, you can generate a 64-bit version yourself,


    •You can contact the vendor for an updated version,


    •You can search for an alternative solution.


    Native 64-bit processes in Office 2010 cannot load 32-bit binaries. This includes the common controls of MSComCtl (TabStrip, Toolbar, StatusBar, ProgressBar, TreeView, ListViews, ImageList, Slider, ImageComboBox) and the controls of MSComCt2 (Animation, UpDown, MonthView, DateTimePicker, FlatScrollBar).These controls were installed by previous versions of Microsoft Office and are installed by 32-bit Office 2010. An alternative must be found for existing Microsoft Office VBA solutions that utilize these controls when the code is migrated to 64-bit Office 2010. 64-bit Office 2010 does not provide 64-bit versions of the Common Controls
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  5. #25
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 281
    Points : 289
    Points
    289
    Par défaut
    Merci pour ces importantes précisions

    Citation Envoyé par clementmarcotte Voir le message
    (...)
    Donc, pour office 2007 et avant, il faut Compiler en 32 bits et enregistrer en 32 bits.
    (...)
    Pourtant, ma dll "compilée" sur mon seven 64 bits et "enregistrée" sur le vista 32 bits de rv26t a ... fonctionné !

    C'est bizarre...

    Je met en rappel ci-dessous le post #21 de rv26t:

    Citation Envoyé par rv26t Voir le message
    Essai dll

    J'ai pris ta dll fourni dans le post 11 (mon antivirus la trouve ok)

    Enreg avec regasm (32 bits sur mon système)

    Ajout de la réf dans excel avec ton tlb : ok.
    Test : ok. La fenêtre s'ouvre.(...)
    Pour reprendre correctement mes tests, pouvez-vous me dire comment désenregistrer "complètement" mes dlls (cf DEMANDE D'AIDE 1 post #23). Regasm /u est sans effet, et regsrv32 /u m'indique qu'il ne trouve pqs le point d'entrée de la dll

    Développement VBNet sous Visual Studio Community 2013 (environnement Windows 10)

  6. #26
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par Golard Voir le message
    Pourtant, ma dll "compilée" sur mon seven 64 bits et "enregistrée" sur le vista 32 bits de rv26t a ... fonctionné !

    C'est bizarre...
    Sauf qu'il me semble que ta DLL n'est pas en 64 bits.
    en la passant dans "dumpbin" on a :
    Dump of file D:\data\aide\Alarmes-ReecritEn2008Express-VersionLight\Alarmes-ReecritEn2008Express-VersionLight\Alarmes\Alarmes\bin\Release\alarmes.dll

    PE signature found

    File Type: DLL

    FILE HEADER VALUES
    14C machine (x86)
    4 number of sections
    53F5F7FE time date stamp Thu Aug 21 15:45:34 2014
    0 file pointer to symbol table
    0 number of symbols
    E0 size of optional header
    2102 characteristics
    Executable
    32 bit word machine
    DLL

    ...
    Normalement, la ligne "machine" devrait marquer (x64)
    De plus à la fin de la section "FILE HEADER VALUES" il y a "32 bit word machine DLL" (la version 64 devrait marquer quelque chose comme "Application can handle large (>2GB) addresses")
    A vérifier tout de même.

    [Edit] Essaye en l'enregistrant en 32.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  7. #27
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 281
    Points : 289
    Points
    289
    Par défaut
    Tu as raison ! Comme mon VBexpress s'est installé dans le dossier "Program Files (x86)", c'est donc qui'il tourne en 32 bits.

    Je dispose finalement d'un vbexpress 2012 en 32 bits et d'un office 2007 en 32 bits (le fait d'être sur un poste seven 64 bits n'intervient pas).
    Je vais donc refaire un test complet avec ton exemple de code "light" + le regasm 32 bits de mon poste + essayer de le faire tourner sur mon office 2007.

    2 petites questions:
    ==> si ça ne fonctionne pas, est-il utile que je recherche un poste avec environnement 32 bits pour essayer ?
    ==> si ça fonctionne (), est-ce que c'est censé fonctionner sur n'importe quel poste du moment qu'il s'agit d'un office 32bits ?

    Peux-t'on finalement résumer:

    dll + tlb généré en 32 bits + xlsm ===> fonctionnera sur tout poste avec office 32 bits ...?
    dll + tlb généré en 64 bits + xlsm ===> fonctionnera sur tout poste avec office 64 bits ...?

    Je vous tiens au courant pour mon test (ce soir j'espère)

    Développement VBNet sous Visual Studio Community 2013 (environnement Windows 10)

  8. #28
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 281
    Points : 289
    Points
    289
    Par défaut
    Résultat du test:

    • Alarmes15.dll développée et buildée sous MVBE 2008 32 bits (sur poste seven 64 bits)
    • Alarmes15.tlb générée par Regasm.exe 32 bits issue du répertoire C:\Windows\Microsoft.NET\Framework\v4.0.30319
    • ClasseurTest15.xlsm créé sous Office 2007 32bits.


    Erreur à l'exécution du code VBA à la ligne "Set monAlarme = New Alarmes15.InterfaceAlarme"

    Nom : Erreur429.png
Affichages : 263
Taille : 4,4 Ko


    Je vous joins les 3 fichiers dans le zip Dll_Test15.zip

    Dll_Test15.zip

    Où cela cloche t'il ???

    rv26t, peux-tu me dire si mon fichier tlb contient bien les points d'entrées vers les interfaces et/ou procédure ?
    D'ailleurs où puis-je me procurer ce fameux dumpbin ?

    Pouvez-vous tester mes 3 fichiers sans rebuilder la dll et sans régénérer le tlb ?

    Merci...

    Développement VBNet sous Visual Studio Community 2013 (environnement Windows 10)

Discussions similaires

  1. [GSL] Utilisation dans une DLL
    Par guillaumeFLAM dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 07/08/2013, 16h19
  2. [MySQL] recuperer une valeur dans une liste deroulante pour l'utiliser dans une seconde liste
    Par tortue_22 dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 12/05/2010, 11h50
  3. Réponses: 4
    Dernier message: 04/07/2008, 10h34
  4. Réponses: 4
    Dernier message: 07/05/2007, 21h38
  5. Réponses: 16
    Dernier message: 06/08/2006, 23h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo