2009-11-19 24 views
8

Nous utilisons Indy et nous avons besoin du support SSL eMail dans notre application, mais nous devons avoir notre application en un seul .Exe.Utiliser SSL avec Delphi mais ayant toujours un seul exe

Nous savons que le gestionnaire Indy par défaut nécessite d'avoir les dll dans le chemin. Extraire les Dll de l'une des ressources du EXE serait le dernier recours.

De meilleures idées?

+0

Je suppose que vous parlez des deux ouverts SSL DLL qui utilise Indy? Ce dont vous avez besoin, c'est d'une implémentation Delphi de ce que font ces DLL, ce dont je doute est disponible. –

+0

Oui, j'en ai parlé. Mais je ne pense pas qu'une implémentation Delphi des bibliothèques OpenSSL soit la seule solution. En tout cas merci pour la clarification. –

Répondre

2

L'exigence "Single EXE" est-elle nécessaire à des fins de distribution ou doit-elle être également un fichier .EXE unique lors de l'exécution sur la machine du client? Si c'est seulement à des fins de distribution, vous pouvez ajouter les fichiers DLL à la fin de votre fichier .EXE, puis - au démarrage du programme - les extraire du fichier .EXE et les stocker localement sous forme de fichiers .DLL, quelquechose comme ceci:

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'Styty, pas correctement formaté, etc., mais devrait vous donner l'idée de base.

+5

Je pense que votre touche shift est restée plutôt mauvaise ... –

+0

Peut-être qu'il était un programmeur COBOL et que les bouchons le font se sentir plus à l'aise ... – Mick

+1

Un programmeur COBOL expérimenté peut écrire un programme COBOL dans n'importe quelle langue. ;-) –

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 requiert toutes sortes de DLL à installer sur la machine de l'utilisateur final. Si les versions antérieures d'Outlook sont installées, elles sont automatiquement présentes, mais MS a arrêté d'installer les fichiers CDO avec Outlook 2007 et versions ultérieures, et fournit ainsi une redist pour CDO. –

3

Soyez au courant: si vous ajoutez le support SSL/TLS dans votre exécutable, il pourrait devenir restricted for export. Si vous êtes aux États-Unis, cela pourrait signifier que votre application ne peut être vendue ou donnée à des personnes en dehors des États-Unis. C'est pourquoi ces DLL ne font pas partie d'Indy ou de Delphi elles-mêmes.

Les bibliothèques que Delphi utilise sont en fait des DLL compilées à partir du projet OpenSSL. Mais si vous avez une bonne connaissance de C, alors vous devriez être capable de compiler la source en fichiers .obj et de les lier avec votre code Delphi à la place. Vous aurez probablement besoin de modifier une partie du code Indy pour cela aussi. Bien sûr, d'autres auraient pu le faire aussi, mais cela rend l'exportation de ces composants Indy (ou même de Delphi lui-même) plus complexe, à cause de ces restrictions à l'exportation. Curieusement, le code source est protégé par le premier amendement qui vous permet essentiellement d'imprimer le code dans un livre, puis l'envoyer à une nation voyous. Alors que si vous l'envoyez sous forme numérique (compilé ou non), alors vous commettez une infraction fédérale et devrez probablement faire attention quand vous prenez le savon dans la douche pendant au moins un an ... Personne n'a prétendu que les lois ont un sens. Ils peuvent juste être une douleur dans le [bip] ...

D'autres solutions SSL ne fonctionnent pas avec les composants Indy, ce qui signifie que vous devrez réécrire une partie de votre code pour prendre en charge ces autres solutions.


This link indique comment charger une DLL depuis la mémoire, vous n'avez donc pas besoin de l'avoir sur le disque. C'est une solution alternative que je n'ai pas essayée. Je ne pense pas que cela fonctionnera, puisque les deux DLL dépendent l'une de l'autre, mais cela pourrait valoir la peine d'essayer ...

+0

À moins que son plan consiste à demander au client d'aller télécharger les DLL séparément, il serait quand même soumis aux restrictions d'exportation puisqu'il distribuait le programme et les DLL requises ensemble. –

+0

AFAIK certaines restrictions d'exportation ont été levées - par exemple, Apache propose désormais des téléchargements SSL. –

+0

La restriction à l'exportation concerne principalement les exportations des États-Unis, bien que d'autres pays appliquent des restrictions similaires. Ignorer cette restriction est à vos risques et périls, bien que je ne m'attends pas à ce que le risque soit réel. La bibliothèque OpenSSL contient beaucoup de technologies de cryptage, donc cette bibliothèque est restreinte. Apache-SSL est basé sur OpenSSL mais est hébergé par une organisation au Royaume-Uni, donc d'autres restrictions s'appliquent à eux. –

1

J'utilise CAPICOM de Microsoft pour ssl3 et résolu mes besoins ...Il est librement redistribuable mais abandonnées

Si vous essayez d'autres composants peut-être vous devriez chercher à SYNAPSE (à http://synapse.ararat.cz/) (Je l'utilise aussi), il peut travailler avec StreamSec (et d'autres) pour envoyer des emails sur ssl. C'est gratuit et facile à travailler.

0

Il est possible d'inclure ces DLL dans l'exécutable du programme en tant que ressources et de les exporter vers des fichiers ou de les utiliser sans les exporter en déplaçant le code et en recherchant les points d'entrée en mémoire. J'ai le code quelque part pour faire le dernier ....

2

Avez-vous essayé de compiler la source OpenSLL vous-même et en important les fichiers d'objet dans Delphi?

Lectures recommandées: Using C object files in Delphi - explique comment créer un programme qui n'a pas besoin d'une DLL, et peut être déployé dans une seule pièce

+0

Indy 10 possède une unité 'IdSSLOpenSSLHeaders_static.pas' pour la liaison statique à OpenSSL. Il est destiné à être utilisé sur iOS uniquement, mais pourrait être adapté pour fonctionner sur d'autres plateformes, si vous avez des OBJ appropriés. –