ActiveX, la instalación no funciona

Quiero crear y desplegar un complemento ActiveX, algo realmente pequeño. Solo quiero mostrar un cuadro de mensaje.

Creé un proyecto de biblioteca para él y lo compilé en una DLL. El complemento funciona cuando registro el dll a través de la línea de comando ( regasm ) en una máquina.

Así que ahora necesito crear un instalador, ponerlo dentro de un archivo CAB y firmarlo.

He instalado Visual Studio 2008 para usar el proyecto de instalación de instalación (pero puedo usar InstallShield de 2010+ si alguien puede explicar cómo hacerlo). Agrego mi dll a la carpeta de aplicaciones y lo marco como Register = vsdrpCOM y lo construyo y obtengo un .msi y .exe.

Creo que solo necesito el archivo msi y no el exe. Creé un archivo setup.inf con el siguiente contenido:

 [version] signature="$CHICAGO$" AdvancedINF=2.0 [Setup Hooks] hook1=hook1 [hook1] run=msiexec.exe /i "%EXTRACT_DIR%\ActiveInstaller.msi" /qn 

Para comstackr el archivo .cab, utilizo el comando makecab / f build.ddf. Aquí está mi archivo .ddf:

 .Set DiskDirectoryTemplate=; .Set CabinetNameTemplate=ActiveInstaller.cab ../ActiveInstaller.msi ../setup.inf 

Esto generó el archivo cab. Ahora necesito firmarlo. Por el momento, utilicé un certificado autofirmado que genere e instalé en mi pc (cuando reviso el archivo de la cabina de firmas, Windows dice que es seguro). Utilizo otra línea de comando que es signtool signwizard (también bash firmarlo manualmente desde aquí ). Luego, el archivo se firma y lo cargo en mi sitio web, inicio el sitio web, me piden que instale el complemento y lo instalo.

Pero luego, no funciona, no tengo idea de por qué. He intentado tantas cosas, con diferentes instaladores, diferentes opciones, diferentes archivos inf, diferentes métodos de firma, etc.

El único tutorial que encontré tiene al menos tres años, no sé si algo ha cambiado desde que se escribieron. Aquí está el enlace principal que utilicé: http://blogs.msdn.com/b/asiatech/archive/2011/12/05/how-to-develop-and-deploy-activex-control-in-c.aspx y otro http://www.codeproject.com/Articles/24089/Create-ActiveX-in-NET-Step-by-Step

SOLUCIÓN:

Entonces, todo lo que dijo Pepo es cierto, así que marqué su respuesta como aceptada. También encontré aquí a alguien que incluye todo el código fuente (incluido cómo crear el .exe que ejecuta el msi).

El problema puede ser que intente ejecutar msiexec.exe y este exe no se encuentre en el archivo cab. Mira esta pregunta (asegúrate de desplazarte hacia abajo para ver el código de muestra increíblemente útil publicado por Roey 5 de agosto de 2009). Intente crear un archivo setup.exe que ejecutará el proceso msiexec.exe e instalará su msi o creará un instalador con un archivo bootstrap setup.exe e incluirá ambos en la cabina.

Además, es posible que desee leer sobre instalaciones no activas de administrador .

Su dll activex debe estar firmado y su activeX debe implementar esta interfaz

 ///  /// Options supported for the IObjectSafety interface ///  [Serializable] [ComVisible(true)] public enum ObjectSafetyOptions { ///  /// Indicates that the caller of the interface identified by riid might be untrusted. ///  INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001, ///  /// Indicates that the data passed into the interface identified by riid might be untrusted. ///  INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002, ///  /// Indicates that the caller of the interface identified by riid knows to use IDispatchEx. ///  INTERFACE_USES_DISPEX = 0x00000004, ///  /// Indicates that the data passed into the interface identified by riid knows to use IInternetHostSecurityManager. ///  INTERFACE_USES_SECURITY_MANAGER = 0x00000008 }; ///  /// Provides methods to get and set safety options. /// The IObjectSafety interface should be implemented by objects that have interfaces which support "untrusted" clients, such as scripts. /// It allows the owner of the object to specify which interfaces must be protected from "untrusted" use. ///  [ComImport()] [Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IObjectSafety { ///  /// Gets the safety options supported by an object and the safety options that are currently set for that object. ///  /// An interface identifier for a given object /// Receives the address of a DWORD representing all the options supported for the interface identified by riid. /// Receives the address of a DWORD representing all the options currently enabled for the interface identified by riid. /// Returns one of the following values: /// S_OK - the object is safe for loading /// E_NOINTERFACE - the riid parameter specifies an interface that is unknown to the object [PreserveSig] long GetInterfaceSafetyOptions(ref Guid iid, out int pdwSupportedOptions, out int pdwEnabledOptions); ///  /// Returns whether an object is safe for initialization or scripting, as specified. ///  /// An iInterface identifier for the object to be made safe. /// A mask representing the options to be validated. /// A DWORD representing all the options currently enabled for the interface identified by riid.  /// Returns one of the following values: /// S_OK - the object is safe for loading /// E_NOINTERFACE - the riid parameter specifies an interface that is unknown to the object /// E_FAIL - the dwOptionSetMask parameter specifies an option that is not supported by the object [PreserveSig] long SetInterfaceSafetyOptions(ref Guid iid, int dwOptionSetMask, int dwEnabledOptions); }; 

Usé el instalador avanzado para crear el instalador msi y establecí el registro dll . El instalador avanzado generó todas las claves de registro necesarias.

En mi prueba, el archivo inf final era

 [version] signature="$CHICAGO$" AdvancedINF=2.0 [Deployment] InstallScope=user|machine [Setup Hooks] install=install [install] run="""%EXTRACT_DIR%\runmsi.exe""" """%EXTRACT_DIR%\simpleactivex.msi""" 

Tenga en cuenta las comillas triples. Son importantes.

Usé este ddl

 .Set DiskDirectoryTemplate=. .Set CabinetNameTemplate=simpleactivex.cab runmsi.exe simpleactivex.msi simpleactivex.inf 

Y construyo la cabina usando estos comandos

 "c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\signtool.exe" sign /sha1 9A15DC8F51773C557BA2F75CF155F8CBD367A8E1 /tr http://tsa/tsa /d SimpleActiveX /du "http://yourcompany.com" /v runmsi.exe simpleactivex.msi makecab /V3 /F make.ddl "c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\signtool.exe" sign /sha1 9A15DC8F51773C557BA2F75CF155F8CBD367A8E1 /tr http://tsa/tsa /d simpleactivex /du "http://yourcompany.com" /v simpleactivex.cab 

runmsi.exe es un archivo ficticio exe que ejecuta msiexec con parámetros dados. Alternativamente, puede usar exe installer o bootstrap exe y msi installer. La parte importante a tener en cuenta es que IE no permitirá ejecutar nada fuera del archivo cab. Por lo tanto, tienes que hacer este truco.

Al depurar, utilicé esta página dummy html

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