none
ASP VB.NET ActiveX RRS feed

  • Question

  • Bonjour,

    Je travail sur la réécriture d'un activex c++ en vb.net utilisé dans un site en ASP.

    Voici le code simplifié de mon ActiveX :

    Imports System
    Imports System.Text
    Imports System.Runtime.InteropServices
    Imports System.IO
    Imports System.Reflection
    Imports Microsoft.Win32
    Imports System.Threading
    Imports System.Math
    
    Namespace MonNameSpace
    
      <ComVisible(True)> _
      Public Interface ImyClass
    
        <ComVisible(True)> _
        Property p1 As String
    
        <ComVisible(True)> _
        Sub mySub()
      End Interface
    
      <ComVisible(True), ComClass(myClass.ClassId, _
        myClass.InterfaceId, _
        myClass.EventsId)> _
      Public Class myClass
        Implements ImyClass
    
    #Region "COM GUIDs"
        ' These GUIDs provide the COM identity for this class
        ' and its COM interfaces. If you change them, existing
        ' clients will no longer be able to access the class.
        'You should create your own 3 GUIDS using GuidGen
        Public Const ClassId As String = "FD9960D1-AA42-4AD8-B2B3-1F62EDA84A33"
        Public Const InterfaceId As String = "8BC305EF-1738-4272-BD27-6795ED13F34A"
        Public Const EventsId As String = "DE5AD37E-C97E-440E-8C9A-8CF2DC764D06"
    #End Region
    
    #Region "REQUIRED FOR ACTIVEX"
        ' This function is called when registered (no need to change it)
        <ComRegisterFunction()> _
        Private Shared Sub ComRegister(ByVal t As Type)
          Dim keyName As String = "CLSID\\" & t.GUID.ToString("B")
          Dim key As RegistryKey = Registry.ClassesRoot.OpenSubKey(keyName, True)
    
          key.CreateSubKey("Control").Close()
          Dim subkey As RegistryKey = key.CreateSubKey("MiscStatus")
          subkey.SetValue("", "131201")
          subkey = key.CreateSubKey("TypeLib")
          Dim libid As Guid = Marshal.GetTypeLibGuidForAssembly(t.Assembly)
          subkey.SetValue("", libid.ToString("B"))
          subkey = key.CreateSubKey("Version")
          Dim ver As Version = t.Assembly.GetName().Version
          Dim version As String = String.Format("{0}.{1}", ver.Major, ver.Minor)
          If version = "0.0" Then version = "1.0"
          subkey.SetValue("", version)
    
        End Sub
    
        ' This is called when unregistering (no need to change it)
        <ComUnregisterFunction()> _
        Private Shared Sub ComUnregister(ByVal t As Type)
          ' Delete entire CLSID¥{clsid} subtree
          Dim keyName As String = "CLSID\\" & _
            t.GUID.ToString("B")
          Registry.ClassesRoot.DeleteSubKeyTree(keyName)
        End Sub
    
    #End Region
    
        
        Private _p1 As String = String.Empty
    
        <ComVisible(True)> _
        Public Property p1 As String Implements ImyClass.p1
          Get
            Return _p1
          End Get
          Set(ByVal value As String)
            _p1 = value
          End Set
        End Property
    
    
        Public Sub New()
    
          ' Cet appel est requis par le concepteur.
          InitializeComponent()
    
        End Sub
    
        <ComVisible(True)> _
        Public Sub mySub() Implements ImyClass.mySub
    	  Dim o As System.Windows.Forms.Form = New System.Windows.Forms.Form
          With o
            .Width = Me.Width
            .Height = Me.Height
            .Controls.Add(Me)
          End With
    
          o.ShowDialog()
    
        End Sub
    
      End Class
    End MonNameSpace
    

    J'ai bien cocher les cases pour rendre mon assembly visible de COM.

    Voici comment je l'intégre à ma page web :

    <html>
    
    	<object id="myObject" name="myObject"
    classid="CLSID:FD9960D1-AA42-4AD8-B2B3-1F62EDA84A33"
    codebase="Cab/myObject.CAB#version=1,0,0,0"
    height="10" width="10" >
    </object>
    
    .....
    
    
    function test() {
    myObject.p1="toto";
    myObject.mySub();
    }

    Tel qu'il est au dessus, l'appel de mySub dans mon site web ne fonctionne pas par contre j'ai accès à la prpriété p1.

    De plus, si je place l'appel à mySub dans le new de mon ActiveX, ça fonctionne.

    Je ne comprends pas pourquoi...

    Merci de votre aide.

     

     


     

    • Déplacé Gabriel MongeonModerator jeudi 7 juillet 2011 19:14 Question ASP.Net (Origine :Développement .NET (en général))
    mardi 5 juillet 2011 14:20

Réponses

  • Finalement j'ai réglé mon problème.

     

    Si ça peut aider quelqu'un tant mieux :

    J'ai ajouter une classe à ma dll qui s'occupe d'instancier mon controle utilisateur, c'est cette nouvelle classe qui est public et qui est en interaction avec le code ASP.

    J'ai tout de même modifié le code de la page asp en utilisant ActiveXObect("") pour déclarer une instance de mon ActiveX et donc de ma nvlle classe.

    Le déploiement se fait via un setup qui enregistre correctement l'activex.

    j'espère avoir été suffisament clair...

     

     

     

    • Marqué comme réponse js3g vendredi 8 juillet 2011 14:20
    vendredi 8 juillet 2011 14:18

Toutes les réponses

  • Bonjour,

    J’ai essayé à tester votre code, mais il manque certain aspects : par exemple la définition de InitializeComponent(). De ce que je vois, vous ajutez l’objet de type myClass (qui est un mot réservé en VB, donc il faut changer le nom de la classe) a une forme qui devient un popup, donc l’objet sera un control ?

     

    Le problème est que je ne comprends pas ce que vous voulez faire, parce que vous ajoutez sur la page l’object ActiveX qui semble être un control Windows Forms et puis dans la procédure mySub vous essayez ajouter le même contrôle dans un popup.

     

    Puis, l’appel à mySub fonctionne dans le constructeur de la classe parce que l’objet ActiveX est créé avec ce constructeur. Dans l’autre situation est-ce qu’il y a un message d’erreur ou qu’est-ce qu’il se passe exactement ? Où est la fonction test() appelée (on voit seulement sa definition) ?

     

    Si on n’a pas le code exact que vous utilisez et une description de fonctionnalités de votre ActiveX, il est difficile vous répondre à la question.

     

    Cordialement,

    Cipri

     


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    jeudi 7 juillet 2011 13:58
  • Bonjour et merci de votre réponse !

     

    Donc j'ai nommé ds mon exemple 'myClass' juste pour partager le code, je n'ai pas pensé à ce pb...Dans mon projet réel aucun souci la classe se nomme différemment.

    Oui mon 'ActiveX' sera utilisé comme un control, le but de l'ActiveX est la signature électronique, nous avons donc une partie de celle ci qui est le texte à signer et une autre qui est la liste des certificats installés sur le poste du client (d'ou mon besoin d'un l'ActiveX).

    Le contrôle ne doit pas être visible sur la page web (height et width à 0) et en cliquant sur un bouton de celle ci le controle doit s'afficher dans une fenêtre dialog.

    Lors de l'appel à la fonction mySub j'obtiens un message d'erreur : "Cet objet ne gère pas cette propriété ou cette méthode"

    Je reste disponible si cela ne vous suffit pas, merci d'avance.

     

    Cordialement,

     

    Julien

     

    vendredi 8 juillet 2011 10:05
  • Finalement j'ai réglé mon problème.

     

    Si ça peut aider quelqu'un tant mieux :

    J'ai ajouter une classe à ma dll qui s'occupe d'instancier mon controle utilisateur, c'est cette nouvelle classe qui est public et qui est en interaction avec le code ASP.

    J'ai tout de même modifié le code de la page asp en utilisant ActiveXObect("") pour déclarer une instance de mon ActiveX et donc de ma nvlle classe.

    Le déploiement se fait via un setup qui enregistre correctement l'activex.

    j'espère avoir été suffisament clair...

     

     

     

    • Marqué comme réponse js3g vendredi 8 juillet 2011 14:20
    vendredi 8 juillet 2011 14:18
  • Bonjour,

     

    Merci pour tenir la communauté informée sur la suite de vos démarches.

     

    Bonne journée,

     

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    mardi 12 juillet 2011 14:43