javascript - running a dll with activex objects with c# - Stack Overflow

Hi i have following c# code for configuring active x ponents asusing System;using System.Reflection;u

Hi i have following c# code for configuring active x ponents as

using System;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using Microsoft.Win32;

namespace Kosmala.Michal.ActiveXTest
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    [ProgId("Dendrite.WebForce.MMP.Web.OurActiveX")]
    [ClassInterface(ClassInterfaceType.AutoDual), ComSourceInterfaces(typeof(ControlEvents))] //Implementing interface that will be visible from JS
    [Guid("121C3E0E-DC6E-45dc-952B-A6617F0FAA32")]
    [ComVisible(true)]
    public class ActiveXObject
    {
        private string myParam = "Empty"; 

        public ActiveXObject()
        {

        }

        public event ControlEventHandler OnClose;

        /// <summary>
        /// Opens application. Called from JS
        /// </summary>
        [ComVisible(true)]
        public void Open()
        {
            //TODO: Replace the try catch in aspx with try catch below. The problem is that js OnClose does not register.
            try
            {

                MessageBox.Show(myParam); //Show param that was passed from JS
                Thread.Sleep(2000); //Wait a little before closing. This is just to show the gap between calling OnClose event.
                Close(); //Close application

            }
            catch (Exception e)
            {
                //ExceptionHandling.AppException(e);
                throw e;
            }
        }

        /// <summary>
        /// Parameter visible from JS
        /// </summary>
        [ComVisible(true)]
        public string MyParam
        {
            get
            {
                return myParam;
            }
            set
            {
                myParam = value;
            }
        }


        [ComVisible(true)]
        public void Close()
        {
            if(OnClose != null)
            {
                OnClose(""); //Calling event that will be catched in JS
            }
            else
            {
                MessageBox.Show("No Event Attached"); //If no events are attached send message.
            }
        }



        /// <summary>
        /// Register the class as a control and set it's CodeBase entry
        /// </summary>
        /// <param name="key">The registry key of the control</param>
        [ComRegisterFunction()]
        public static void RegisterClass ( string key )
        {
            // Strip off HKEY_CLASSES_ROOT\ from the passed key as I don't need it
            StringBuilder   sb = new StringBuilder ( key ) ;

            sb.Replace(@"HKEY_CLASSES_ROOT\","") ;
            // Open the CLSID\{guid} key for write access
            RegistryKey k   = Registry.ClassesRoot.OpenSubKey(sb.ToString(),true);

            // And create   the 'Control' key - this allows it to show up in
            // the ActiveX control container
            RegistryKey ctrl = k.CreateSubKey   ( "Control" ) ;
            ctrl.Close ( ) ;

            // Next create the CodeBase entry   - needed if not string named and GACced.
            RegistryKey inprocServer32 = k.OpenSubKey   ( "InprocServer32" , true ) ;
            inprocServer32.SetValue (   "CodeBase" , Assembly.GetExecutingAssembly().CodeBase ) ;
            inprocServer32.Close ( ) ;
                // Finally close the main   key
            k.Close (   ) ;
            MessageBox.Show("Registered");
        }

        /// <summary>
        /// Called to unregister the control
        /// </summary>
        /// <param name="key">Tke registry key</param>
        [ComUnregisterFunction()]
        public static void UnregisterClass ( string key )
        {
            StringBuilder   sb = new StringBuilder ( key ) ;
            sb.Replace(@"HKEY_CLASSES_ROOT\","") ;

            // Open HKCR\CLSID\{guid} for write access
            RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(),true);

            // Delete the 'Control' key, but don't throw an exception if it does not exist
            k.DeleteSubKey ( "Control" , false ) ;

            // Next open up InprocServer32
            //RegistryKey   inprocServer32 = 
            k.OpenSubKey (  "InprocServer32" , true ) ;

            // And delete the CodeBase key, again not throwing if missing
            k.DeleteSubKey ( "CodeBase" , false ) ;

            // Finally close the main key
            k.Close ( ) ;
            MessageBox.Show("UnRegistered");
        }



    }

    /// <summary>
    /// Event handler for events that will be visible from JavaScript
    /// </summary>
    public delegate void ControlEventHandler(string redirectUrl); 


    /// <summary>
    /// This interface shows events to javascript
    /// </summary>
    [Guid("68BD4E0D-D7BC-4cf6-BEB7-CAB950161E79")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface ControlEvents
    {
        //Add a DispIdAttribute to any members in the source interface to specify the COM DispId.
        [DispId(0x60020001)]
        void OnClose(string redirectUrl); //This method will be visible from JS
    }
}

and i have created the testpage .html as

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > 

<html>
  <head>
    <title>WebForm1</title>
    <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
    <meta name="CODE_LANGUAGE" Content="C#">
    <meta name=vs_defaultClientScript content="JavaScript">
    <meta name=vs_targetSchema content="">
  </head>
  <body onload="OpenActiveX()">

  <!-- Our activeX object -->
  <OBJECT id="OurActiveX" name=”OurActiveX" classid="clsid:121C3E0E-DC6E-45dc-952B-A6617F0FAA32" VIEWASTEXT codebase="OurActiveX.cab"></OBJECT> 

  <!-- Attaching to an ActiveX event-->
<script language="javascript">
           function OurActiveX::OnClose(redirectionUrl)
       {
        alert(redirectionUrl);   <!--  should be returned-->
                    //window.location = redirectionUrl;
           }
</script>


<script language="javascript">
    //Passing parameters to ActiveX object and starting application
function OpenActiveX()
{
    try
    {
        document.OurActiveX.MyParam = "Hi I am here." //Passing parameter to the ActiveX
        document.OurActiveX.Open(); //Running method from activeX
    }
    catch(Err)
    {
        alert(Err.description);
    }
}   


</script>

  </body>
</html>

now when i am running the html page in internet explorer browser i am getting following error as

OBJECT DOES NOT SUPPORT PROPERTY OR METHOD OPEN

can you help me to fix these problem

waiting for your valuable ments and responses

Hi i have following c# code for configuring active x ponents as

using System;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using Microsoft.Win32;

namespace Kosmala.Michal.ActiveXTest
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    [ProgId("Dendrite.WebForce.MMP.Web.OurActiveX")]
    [ClassInterface(ClassInterfaceType.AutoDual), ComSourceInterfaces(typeof(ControlEvents))] //Implementing interface that will be visible from JS
    [Guid("121C3E0E-DC6E-45dc-952B-A6617F0FAA32")]
    [ComVisible(true)]
    public class ActiveXObject
    {
        private string myParam = "Empty"; 

        public ActiveXObject()
        {

        }

        public event ControlEventHandler OnClose;

        /// <summary>
        /// Opens application. Called from JS
        /// </summary>
        [ComVisible(true)]
        public void Open()
        {
            //TODO: Replace the try catch in aspx with try catch below. The problem is that js OnClose does not register.
            try
            {

                MessageBox.Show(myParam); //Show param that was passed from JS
                Thread.Sleep(2000); //Wait a little before closing. This is just to show the gap between calling OnClose event.
                Close(); //Close application

            }
            catch (Exception e)
            {
                //ExceptionHandling.AppException(e);
                throw e;
            }
        }

        /// <summary>
        /// Parameter visible from JS
        /// </summary>
        [ComVisible(true)]
        public string MyParam
        {
            get
            {
                return myParam;
            }
            set
            {
                myParam = value;
            }
        }


        [ComVisible(true)]
        public void Close()
        {
            if(OnClose != null)
            {
                OnClose("http://otherwebsite."); //Calling event that will be catched in JS
            }
            else
            {
                MessageBox.Show("No Event Attached"); //If no events are attached send message.
            }
        }



        /// <summary>
        /// Register the class as a control and set it's CodeBase entry
        /// </summary>
        /// <param name="key">The registry key of the control</param>
        [ComRegisterFunction()]
        public static void RegisterClass ( string key )
        {
            // Strip off HKEY_CLASSES_ROOT\ from the passed key as I don't need it
            StringBuilder   sb = new StringBuilder ( key ) ;

            sb.Replace(@"HKEY_CLASSES_ROOT\","") ;
            // Open the CLSID\{guid} key for write access
            RegistryKey k   = Registry.ClassesRoot.OpenSubKey(sb.ToString(),true);

            // And create   the 'Control' key - this allows it to show up in
            // the ActiveX control container
            RegistryKey ctrl = k.CreateSubKey   ( "Control" ) ;
            ctrl.Close ( ) ;

            // Next create the CodeBase entry   - needed if not string named and GACced.
            RegistryKey inprocServer32 = k.OpenSubKey   ( "InprocServer32" , true ) ;
            inprocServer32.SetValue (   "CodeBase" , Assembly.GetExecutingAssembly().CodeBase ) ;
            inprocServer32.Close ( ) ;
                // Finally close the main   key
            k.Close (   ) ;
            MessageBox.Show("Registered");
        }

        /// <summary>
        /// Called to unregister the control
        /// </summary>
        /// <param name="key">Tke registry key</param>
        [ComUnregisterFunction()]
        public static void UnregisterClass ( string key )
        {
            StringBuilder   sb = new StringBuilder ( key ) ;
            sb.Replace(@"HKEY_CLASSES_ROOT\","") ;

            // Open HKCR\CLSID\{guid} for write access
            RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(),true);

            // Delete the 'Control' key, but don't throw an exception if it does not exist
            k.DeleteSubKey ( "Control" , false ) ;

            // Next open up InprocServer32
            //RegistryKey   inprocServer32 = 
            k.OpenSubKey (  "InprocServer32" , true ) ;

            // And delete the CodeBase key, again not throwing if missing
            k.DeleteSubKey ( "CodeBase" , false ) ;

            // Finally close the main key
            k.Close ( ) ;
            MessageBox.Show("UnRegistered");
        }



    }

    /// <summary>
    /// Event handler for events that will be visible from JavaScript
    /// </summary>
    public delegate void ControlEventHandler(string redirectUrl); 


    /// <summary>
    /// This interface shows events to javascript
    /// </summary>
    [Guid("68BD4E0D-D7BC-4cf6-BEB7-CAB950161E79")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface ControlEvents
    {
        //Add a DispIdAttribute to any members in the source interface to specify the COM DispId.
        [DispId(0x60020001)]
        void OnClose(string redirectUrl); //This method will be visible from JS
    }
}

and i have created the testpage .html as

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > 

<html>
  <head>
    <title>WebForm1</title>
    <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
    <meta name="CODE_LANGUAGE" Content="C#">
    <meta name=vs_defaultClientScript content="JavaScript">
    <meta name=vs_targetSchema content="http://schemas.microsoft./intellisense/ie5">
  </head>
  <body onload="OpenActiveX()">

  <!-- Our activeX object -->
  <OBJECT id="OurActiveX" name=”OurActiveX" classid="clsid:121C3E0E-DC6E-45dc-952B-A6617F0FAA32" VIEWASTEXT codebase="OurActiveX.cab"></OBJECT> 

  <!-- Attaching to an ActiveX event-->
<script language="javascript">
           function OurActiveX::OnClose(redirectionUrl)
       {
        alert(redirectionUrl);   <!-- http://otherwebsite. should be returned-->
                    //window.location = redirectionUrl;
           }
</script>


<script language="javascript">
    //Passing parameters to ActiveX object and starting application
function OpenActiveX()
{
    try
    {
        document.OurActiveX.MyParam = "Hi I am here." //Passing parameter to the ActiveX
        document.OurActiveX.Open(); //Running method from activeX
    }
    catch(Err)
    {
        alert(Err.description);
    }
}   


</script>

  </body>
</html>

now when i am running the html page in internet explorer browser i am getting following error as

OBJECT DOES NOT SUPPORT PROPERTY OR METHOD OPEN

can you help me to fix these problem

waiting for your valuable ments and responses

Share Improve this question asked Oct 5, 2012 at 15:59 GowthamanSSGowthamanSS 1,4844 gold badges34 silver badges60 bronze badges 10
  • Is ActiveX enabled in your IE browser? – Lajos Arpad Commented Oct 5, 2012 at 16:26
  • Did you register your ActiveX control using regasm? – Hans Commented Oct 5, 2012 at 16:48
  • @LajosArpad ya i have enabled it – GowthamanSS Commented Oct 6, 2012 at 6:16
  • @Hanssince i ma new i do not know how to register it ? can you provide me steps – GowthamanSS Commented Oct 6, 2012 at 6:17
  • @GowthamanSS: I've provided an answer with steps to register an ActiveX control. – Hans Commented Oct 6, 2012 at 8:19
 |  Show 5 more ments

4 Answers 4

Reset to default 2

You have to register your ActiveX control using the Microsoft .Net Framework regasm.exe tool.

To register your ActiveX control use the following steps:

  1. Open a mand prompt.
  2. Navigate the installation directory of the .Net framework you are targeting (e.g. c:\windows\Microsoft.NET\Framework)
  3. Type the following mand

    regasm.exe /tlb /codebase "path to your ActiveX.dll"

  4. Please note, if you are running on a x64 bit operating system you have to register your ActiveX control for x86 and x64 internet explorer. For x64 internet explorer you have to navigate to the x64 directory of the .Net Framework you are targeting and execute the following mand:

    regasm.exe /tlb /codebase "path to your x64 ActiveX.dll"

During registration of your ActiveX dll you should see a message box with the message "Registered". Please not, if you pile your dlls with platform target "Any CPU" you can use the same dll for registering.

With your test page open in IE, open Internet Options from the tools button on the toolbar (in IE9), select the Security page, click the Custom button and scroll down to the "ActiveX Controls and plug-ins" section. You can enable prompting / enabling of ActiveX controls and scripting of them here.

By default, unsigned ActiveX controls are blocked in IE and signed ActiveX controls will raise a prompt.

I would try un-registering the DLL, changing the GUID, and re-registering your class. Since setting MyParam appears to work, it may be that Open() was added at a later time, and the interface definition is not getting re-registered.

Remove static from the method names, and you will be alright !!

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745342613a4623396.html

相关推荐

  • javascript - running a dll with activex objects with c# - Stack Overflow

    Hi i have following c# code for configuring active x ponents asusing System;using System.Reflection;u

    3小时前
    20

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信