Click here to Skip to main content
15,886,199 members
Please Sign up or sign in to vote.
1.00/5 (2 votes)
Dear All,

I have built activex in dotnet 3.5 it works in my system but if i install in client system with dotnet framework 3.5 setup gives error 1001 but if i install setup with framework 4.0 it works.

I want to make my setup work with dotnet 3.5.
Kindly help me resolve this issue

First Class
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace AdsActiveX_2_0
{
    [ProgId("Ads")]
    [ClassInterface(ClassInterfaceType.AutoDual), ComSourceInterfaces(typeof(ControlEvents))] //Implementing interface that will be visible from JS
    [Guid("B93FE1A0-2AA3-47E4-BF24-D53D6B75C6ED")]
    [ComVisible(true)]
    public class AdstringoCS : IObjectSafetyImpl
    {
        private string myParam = "Empty";

        public AdstringoCS()
        {

        }

        [ComVisible(true)]
        public string MyParam
        {
            get
            {
                return myParam;
            }
            set
            {
                myParam = value;
            }
        }

        [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;
            }
        }

        public event ControlEventHandler OnClose;

        [ComRegisterFunction()]
		public static void RegisterClass ( string key )
		{
            try
            {
                // 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
                //    MessageBox.Show("Registered Successfully");
                k.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
		}

		///	<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	) ;
          //  MessageBox.Show("Unregistered Successfully");
			// Finally close the main key
			k.Close	( )	;
		}

	}

	/// <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
	}
}



Second Class

C#
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.ComponentModel;
using System.Text;

[ComImport, GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
public interface IObjectSafety
{
    [PreserveSig]
    int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);

    [PreserveSig()]
    int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);
}
public class IObjectSafetyImpl : IObjectSafety
{
    private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}";
    private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";
    private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}";
    private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}";
    private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}";

    private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;
    private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;
    private const int _OK = 0;
    private const int _FAIL = unchecked((int)0x80004005);
    private const int _NOINTERFACE = unchecked((int)0x80004002);

    private bool _fSafeForScripting = true;
    private bool _fSafeForInitializing = true;

    public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions)
    {
        int Result = _FAIL;

        string strGUID = riid.ToString("B");
        pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
        switch (strGUID)
        {
            case _IID_IDispatch:
            case _IID_IDispatchEx:
                Result = _OK;
                pdwEnabledOptions = 0;
                if (_fSafeForScripting == true)
                    pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
                break;
            case _IID_IPersistStorage:
            case _IID_IPersistStream:
            case _IID_IPersistPropertyBag:
                Result = _OK;
                pdwEnabledOptions = 0;
                if (_fSafeForInitializing == true)
                    pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
                break;
            default:
                Result = _NOINTERFACE;
                break;
        }

        return Result;
    }

    public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions)
    {
        int Result = _FAIL;

        string strGUID = riid.ToString("B");
        switch (strGUID)
        {
            case _IID_IDispatch:
            case _IID_IDispatchEx:
                if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) &&
                     (_fSafeForScripting == true))
                    Result = _OK;
                break;
            case _IID_IPersistStorage:
            case _IID_IPersistStream:
            case _IID_IPersistPropertyBag:
                if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) &&
                     (_fSafeForInitializing == true))
                    Result = _OK;
                break;
            default:
                Result = _NOINTERFACE;
                break;
        }

        return Result;
    }
}
Posted
Updated 2-Sep-14 2:14am
v2
Comments
Sergey Alexandrovich Kryukov 1-Sep-14 11:58am    
What's the use of this dump along. Now code sample, no steps to reproduce, nothing.
—SA
Nelek 2-Sep-14 9:25am    
Op answered you in comment below
sunil mali 2-Sep-14 8:16am    
Hi Sergey,

I have updated code, please check and let me know incase of any mistakes.
Please note: This ActiveX works if i install .net 4.0 .
But if i install dotnet 3.5 it doesn't work.

This code is built in dotnet 3.5 but even though i have to use dotnet 4.0 to run this.
Sergey Alexandrovich Kryukov 2-Sep-14 11:36am    
It looks weird.
Main question is: why did you develop ActiveX at all, if you use .NET anyway?
Supposed you created it for some purpose unrelated to .NET, but why using ActiveX in .NET if you have source code of this ActiveX?
—SA
sunil mali 3-Sep-14 1:15am    
I have already shared source code of activex.
My purpose is to create activex and consume it on client side using javascript.
I trigger my activex from javascript get it registered and once registered i consume methods from my activex.
In future methods can be anything.
right now its hello world message.

Its a working code. It works in my system as well as in client system also.
Only problem is when i install dotnet 3.5 it doesn't work.
But if i install 4.0 it works.

I refered below article and some more from various website to create activex
http://www.codeproject.com/Articles/24089/Create-ActiveX-in-NET-Step-by-Step

1 solution

I got answer for this.
To downgrade activex we have to set .net version in installshield.
To do this we need to go to Tools-Options-> .net -> Change regasm.exe location to .net 2.0 root.
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900