Meilleur auteur de réponses
ASP VB.NET ActiveX

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))
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
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
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.
-
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
-
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
-
Bonjour,
Merci pour tenir la communauté informée sur la suite de vos démarches.
Bonne journée,
Cipri
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.