delphi dll skype dllregistration

delphi - COM/DLL sin registro?



skype dllregistration (3)

Mi programa usa Skype4COM.dll (un contenedor para la API de Skype).

Estoy usando Delphi 2010 - ¿hay alguna manera de asegurarme de que mi programa SIEMPRE esté usando Skype4COM.dll con el que lo enviaré? El caso es que hay diferentes versiones de Skype4COM, y si registro el mío sobre otras personas, es posible que su aplicación ya no funcione.

Usualmente uso RegSvr32 para registrar el DLL en el sistema de personas, pero escuché que es posible hacerlo sin registro (en C #), entonces mi pregunta es: ¿Podemos hacer eso en Delphi también?

¡Gracias!


Antes incluso de tocar el registro de la suscripción gratuita, asegúrese de que su aplicación funcione cuando la DLL esté registrada. Una vez que estés contento con esto. Es hora de intentar que funcione gratuitamente. El primer paso es anular el registro de su dll. Si intenta ejecutar su programa ahora, debería obtener ClassId no encontrado.

El primer paso es crear un archivo de manifiesto para su aplicación. Un archivo de manifiesto es un archivo xml que, entre otras cosas, puede configurar dependencias para su aplicación. Puede que no lo sepas, pero desde Delphi 2007, si tienes los temas habilitados, tu aplicación ha tenido un manifiesto desde el principio. Aquí es de Delphi 2010:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity type="win32" name="CodeGear RAD Studio" version="14.0.3615.26342" processorArchitecture="*"/> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*" processorArchitecture="*"/> </dependentAssembly> </dependency> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo> </assembly>

Ahora no estoy seguro de si puede agregar algo a esto y solo puede tener un archivo de manifiesto por aplicación, normalmente lo reemplazo por completo. Como quiero temas habilitados, empiezo con este archivo y agrego mi dependencia. En su caso, necesita agregar una dependencia para skype4com.dll Esto es lo que necesito agregar:

<assemblyIdentity name="Skype4COM.X" version="1.0.36.0" type="win32" processorArchitecture="x86"> </assemblyIdentity>

Tenga en cuenta que en realidad estoy agregando una dependencia al ensamblador Skye4COM.X y no al dll mismo. No confunda el 2, aunque un dll puede ser un ensamblaje, un ensamblaje no es necesariamente 1 dll. Esto quedará claro cuando configuremos el manifiesto de ensamblaje /

Su archivo de manifiesto ahora se convierte en:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity type="win32" name="CodeGear RAD Studio" version="14.0.3615.26342" processorArchitecture="*"/> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*" processorArchitecture="*"/> </dependentAssembly> </dependency> <dependency> <dependentAssembly> <assemblyIdentity name="Skype4COM.X" version="1.0.36.0" type="win32" processorArchitecture="x86"> </assemblyIdentity> </dependentAssembly> </dependency> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo> </assembly>

Guarde este archivo con el mismo nombre que su ejecutable, pero con un sufijo .manifest. Por ejemplo SkypeClient.exe.manifest

El siguiente paso es incorporar este manifiesto en su aplicación. Deberá crear un archivo de recursos (archivo rc) con el siguiente texto:

#define RT_MANIFEST 24 #define APP_MANIFEST 1 APP_MANIFEST RT_MANIFEST SkypeClient.exe.manifest

Agregue este archivo a su aplicación y compilación. Si todavía tiene temas habilitados, recibirá una advertencia de recurso duplicado, simplemente eliminó el {$ R * .res} de su archivo dpr. También debería ver esto en el archivo de proyecto:

{$R ''SkypeClient.manifest.res'' ''SkypeClient.manifest.rc''}

Si intenta ejecutar su aplicación ahora, recibirá el siguiente mensaje de error:

No se puede crear el proceso: la aplicación no se ha podido iniciar porque su configuración lado a lado es incorrecta. Consulte el registro de eventos de la aplicación o use la herramienta de línea de comandos sxstrace.exe para obtener más detalles.

Ahora necesitamos agregar un manifiesto para el ensamblaje (Skype4COM.X). Crea un archivo llamado Skype4COM.X.manifest. Necesitamos describir el ensamblado en el archivo de manifiesto:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity name="Skype4COM.X" version="1.0.36.0" type="win32" processorArchitecture="x86"> </assemblyIdentity> <file name="Skype4COM.dll"> <typelib tlbid="{03282B5D-B38F-469D-849A-09B0A7F4881B}" version="1.0" helpdir="" flags="hasdiskimage"/> </file> </assembly>

¡Ahora coloque la Aplicación, el dll y el manifiesto de conjunto en la misma carpeta y ejecútelo!

Si obtiene más errores, necesitará usar SxSTrace para depurar. Esto está disponible en Vista en adelante. Primero comienza un rastro:

SxSTrace trace -logfile:sxsTrace.etl

ejecuta tu programa, y ​​luego presiona enter en el seguimiento para terminarlo. Ahora analiza el rastro:

SxSTrace parse -logfile:SxSTrace.etl -outfile:SxStrace.txt

Debe tener un registro completo de todo el proceso en SxSTrace.txt


Aquí hay un ejemplo práctico cuando se utiliza la biblioteca ActiveX de Chilkat SSH ( ChilkatSsh.dll ).

ChilkatSsh.dll exporta 6 clases:

  • Chilkat.Ssh
  • Chilkat.Key
  • Chilkat.Sftp
  • Chilkat.SftpFile
  • Chilkat.SftpDir
  • Chilkat.SshTunnel

Para lo cual creé un manifiesto de ensamblaje Chilkat.SSH.manifest :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity type="win32" name="Chilkat.SSH" version="9.3.2.0" /> <file name="ChilkatSsh.dll"> <!-- CLASS_ChilkatSsh --> <comClass progid="Chilkat.Ssh" clsid="{72A1C13F-1C23-4C52-97F0-BCA902148720}" threadingModel="Apartment"> </comClass> <!-- CLASS_ChilkatSshKey --> <comClass progid="Chilkat.SshKey" clsid="{73111D94-E28A-4587-B687-60E23CD989A8}" threadingModel="Apartment"> </comClass> <!-- CLASS_ChilkatSFtp --> <comClass progid="Chilkat.SFtp" clsid="{64A17FBB-89E2-403F-8E06-B7CE412FB0E6}" threadingModel="Apartment"> </comClass> <!-- CLASS_ChilkatSFtpFile --> <comClass progid="Chilkat.SFtpFile" clsid="{B2208BCC-AB0F-4722-A908-2F54269D21C2}" threadingModel="Apartment"> </comClass> <!-- CLASS_ChilkatSFtpDir --> <comClass progid="Chilkat.SFtpDir" clsid="{39B10683-ED49-47A3-A4A5-AB1F52D1C2CC}" threadingModel="Apartment"> </comClass> <!-- CLASS_ChilkatSshTunnel --> <comClass progid="Chilkat.SshTunnel" clsid="{4D881197-5686-45BF-B9D9-9EC432F4BB75}" threadingModel="Apartment"> </comClass> </file> </assembly>

Ahora solo necesita hacer referencia al ensamblaje en el manifiesto de su aplicación. Por ejemplo, de la misma manera que puede declarar una dependencia en Common Controls version 6 :

<dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency>

Usted declara una dependencia de Chilkat SSH :

<dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Chilkat.SSH" version="9.3.2.0" /> </dependentAssembly> </dependency>


Consulte el artículo de While & Muller de MSDN 2005 titulado " Activación sin registro de componentes COM: un tutorial ". Se demuestra con C ++, C # y VB, pero nada de eso es importante. La parte del código, en los pasos 1 a 3, son las mismas cosas que haría en cualquier aplicación COM. El tutorial explica:

La activación sin registro de los componentes COM no requiere ningún código especial en el servidor o en el cliente. Todo lo que se requiere es un par de archivos de manifiesto coincidentes.

Cree un archivo de manifiesto para su DLL COM y luego cree un archivo de manifiesto para su aplicación que se refiera a él.