2009-11-19 23 views
8

Usamos Indy y necesitamos soporte SSL de correo electrónico en nuestra aplicación. Sin embargo, necesitamos tener nuestra aplicación en un solo .Exe.Use SSL con Delphi y aún tenga un solo exe

Sabemos que el controlador predeterminado de Indy requiere tener los dlls en la ruta. La extracción de los Dlls de uno de los recursos del EXE sería el último recurso.

¿Alguna idea mejor?

+0

Es de suponer que estamos hablando los dos DLL SSL abierto que utiliza Indy? Lo que necesitaría es una implementación de Delphi de lo que hacen los archivos DLL, que dudo que esté disponible. –

+0

Sí, hablé sobre ellos. Pero no creo que una implementación Delphi de las librerías OpenSSL sea la única manera de hacerlo. De todos modos, gracias por aclararme. –

Respuesta

2

¿Es el requisito "EXE único" para fines de distribución o también debe ser un archivo .EXE único cuando se ejecuta en la máquina del cliente?

Si solo es para fines de distribución, puede agregar los archivos DLL al final de su archivo .EXE y luego, cuando se inicia el programa, extraerlos del archivo .EXE y almacenarlos localmente como archivos .DLL, algo de esta manera:

VAR F,O : FILE; 
VAR BUF : ARRAY[1..<MaxSizeOfDLLs>] OF BYTE; 
ASSIGN(F,ParamStr(0)); RESET(F,1); 
SEEK(F,<OriginalExeSize>); 
BLOCKREAD(F,BUF,<FirstDllSize>); 
ASSIGN(O,<NameOfFirstDLL>); REWRITE(O,1); 
BLOCKWRITE(O,BUF,<FirstDllSize>); CLOSE(O); 
BLOCKREAD(F,BUF,<SecondDllSize>); 
ASSIGN(O,<NameOfSecondDLL>); REWRITE(O,1); 
BLOCKWRITE(O,BUF,<SecondDllSize>); CLOSE(O); 
SEEK(F,<OriginalExeSize>); TRUNCATE(F); CLOSE(F) 

Quick'n'Dirty, no formateado correctamente, etc., pero debe darle la idea básica.

+5

Creo que su clave de mayúsculas se quedó muy mal ... –

+0

Tal vez solía ser un programador de COBOL y las tapas lo hacen sentir más como en casa ... – Mick

+1

Un programador de COBOL experimentado puede escribir un programa de COBOL en cualquier idioma. ;-) –

0

Const

cdoSendUsingMethod = 'http://schemas.microsoft.com/cdo/configuration/sendusing'; 
    cdoSMTPServer = 'http://schemas.microsoft.com/cdo/configuration/smtpserver'; 
    cdoSMTPServerPort = 'http://schemas.microsoft.com/cdo/configuration/smtpserverport'; 
    cdoSendServerPort = '25'; 
    cdoSendUsingPort = 2; 
    cdoSMTPConnectionTimeout = 'http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout'; 
    cdoSMTPAuthenticate = 'http://schemas.microsoft.com/cdo/configuration/smtpauthenticate'; 
    cdoAnonymous = '0'; 
    cdoBasic = '1'; 
    cdoSMTPUseSSL = 'http://schemas.microsoft.com/cdo/configuration/smtpusessl'; 
    cdoSendUserName = 'http://schemas.microsoft.com/cdo/configuration/sendusername'; 
    cdoSendPassword = 'http://schemas.microsoft.com/cdo/configuration/sendpassword'; 
    cdoURLGetLatestVersion = 'http://schemas.microsoft.com/cdo/configuration/urlgetlatestversion'; 

...

function SensCDOMail (ASubject, AFrom, ATo, ABody, ASmtpServer : WideString): String; 
var 

    cdoMessage:OleVariant; 
    cdoConfiguration: OleVariant; 

begin 

    //Configuration Object 
    cdoMessage:= CreateOleObject('CDO.Message'); 
    cdoConfiguration:= CreateOleObject('CDO.Configuration'); 
    try 

    cdoConfiguration.Fields(cdoSendUsingMethod):= cdoSendUsingPort; 
    cdoConfiguration.Fields(cdoSMTPServer):= ASmtpServer; 
    cdoConfiguration.Fields(cdoSMTPServerPort):= cdoSendServerPort; 
    cdoConfiguration.Fields(cdoSMTPAuthenticate):= cdoAnonymous; 
    cdoConfiguration.Fields(cdoSMTPUseSSL):= True; // use SSL 
    cdoConfiguration.Fields.Update; 
    cdoMessage.Configuration:= cdoConfiguration; 
    cdoMessage.To  := ATo; 
    cdoMessage.From  := AFrom; 
    cdoMessage.Subject := ASubject; 
    //cdoMessage.HTMLBody := ABody; //Want to send in Html format 
    cdoMessage.TextBody := ABody;  //Want to send in text format 
    cdoMessage.Send; 

    finally 
    VarClear(cdoMessage); 
    VarClear(cdoConfiguration); 
    end; 
end; 

+0

CDO requiere todo tipo de archivos DLL para instalarse en la máquina del usuario final. Si se instalan versiones anteriores de Outlook, estas se muestran automáticamente, pero MS detuvo la instalación de los archivos CDO con Outlook 2007 y posterior, y por lo tanto proporciona una redistribución para CDO. –

3

Tenga en cuenta: si se agrega el soporte SSL/TLS dentro de su ejecutable, que podría convertirse en restricted for export. Si se encuentra en los EE. UU., Esto podría significar que su aplicación no puede ser vendida o entregada a personas fuera de los EE. UU. Esta es la razón por la cual estas DLL no son parte de Indy o Delphi.

Las bibliotecas que utiliza Delphi son en realidad DLL compiladas del proyecto OpenSSL. Pero si tiene un buen conocimiento de C, entonces debería poder compilar la fuente para los archivos .obj y, en su lugar, vincularlos con su código Delphi. Probablemente necesites modificar parte del código de Indy para esto también. Por supuesto, otros podrían haber hecho esto también, pero eso hace que la exportación de esos componentes Indy (o incluso Delphi mismo) sea más compleja, debido a esas restricciones a la exportación.

Curiosamente, el código fuente está protegido por la primera enmienda que, básicamente, le permite imprimir el código en un libro y luego enviarlo a algún país deshonesto. Si bien lo enviarías en forma digital (compilada o no), entonces estás cometiendo un delito federal y probablemente tendrás que tener cuidado al recoger el jabón en la ducha durante al menos un año ... Nadie afirmó que las leyes tienen sentido. Pueden ser un problema en el [pitido] ...

Otras soluciones SSL no funcionan junto con los componentes Indy, lo que significa que tendría que volver a escribir parte de su código para admitir esas otras soluciones.


This link indica cómo puede cargar un archivo DLL desde la memoria, por lo que no necesita tenerlo en el disco. Es una solución alternativa que no he probado. No creo que funcione, ya que las dos DLL dependen una de la otra, pero podría valer la pena intentarlo ...

+0

A menos que su plan sea hacer que el cliente vaya a descargar las DLL por separado, estaría sujeto a las restricciones de exportación de todos modos ya que estaría distribuyendo el programa y los archivos DLL necesarios juntos. –

+0

AFAIK se ha eliminado alguna restricción de exportación; por ejemplo, ahora Apache ofrece descargas habilitadas para SSL. –

+0

La restricción de exportación es principalmente cuando se exporta desde los EE. UU., Aunque otros países tienen restricciones similares. Ignorar esta restricción es bajo su propio riesgo, aunque no espero que el riesgo sea realmente grande. La biblioteca OpenSSL contiene bastantes tecnologías de cifrado, por lo que esta biblioteca está restringida. Apache-SSL está basado en OpenSSL pero está alojado en una organización en el Reino Unido, por lo que se aplican otras restricciones. –

1

utilizo CAPICOM de Microsoft para SSL3 y resolver mis necesidades ...Es de libre distribución pero suspendió

Si intenta otros componentes tal vez debería mirar a SYNAPSE (en http://synapse.ararat.cz/) (También uso) que puede trabajar con StreamSec (y otros) para enviar correos electrónicos a través de SSL. Es gratis y fácil de trabajar.

0

Es posible incluir estos archivos DLL en el archivo ejecutable del programa como recursos y exportarlos a los archivos cuando se usan o incluso usarlos sin exportarlos primero reubicando el código y buscando los puntos de entrada en la memoria. Tengo un código en alguna parte para hacer esto último ...

2

¿Ha intentado compilar el código fuente OpenSLL usted mismo e importar los archivos objeto a Delphi? lectura

Recomendado: Using C object files in Delphi - explica cómo crear un programa que no necesita un archivo DLL, y puede ser desplegado en una sola pieza

+0

Indy 10 tiene una unidad 'IdSSLOpenSSLHeaders_static.pas' para enlaces estáticos a OpenSSL. Está diseñado para su uso solo en iOS, pero podría adaptarse para trabajar en otras plataformas, si tiene OBJs adecuados para ello. –

Cuestiones relacionadas