Le système du client est une combinaison de C/S et B/S. La partie B/S était initialement prévue pour utiliser IntraWeb.
Delphi.net est apparu par hasard, donc la partie B/S a été basculée vers Delphi.net ;
Un problème est survenu lors du processus de développement : l'algorithme de chiffrement a été développé par Delphi 7.
Le temps était trop serré et il était impossible de réécrire l'algorithme de chiffrement à l'aide de Delphi.net, j'ai donc pensé à COM/COM+,
Dommage qu'il y ait très peu d'informations sur Delphi.net, et encore moins d'informations sur l'interopérabilité avec COM/COM+.
Je l'ai donc exploré moi-même et j'ai trouvé ce qui suit (code source ci-joint) :
1. Créez COM/COM+ dans Delphi 7
(1) Dans l'EDI, Fichier -> Nouveau -> Autre -> ActiveX -> Bibliothèque ActiveX,
Enregistrez le fichier de projet sous CompRoject ;
(2) Dans l'EDI, Fichier -> Nouveau -> Autre -> ActiveX -> Objet COM,
Remplissez Test dans la colonne Nom de classe et enregistrez l'unité sous Test ;
(3) Ajoutez un processus nommé GetMsg à ITest dans View -> Type Library dans l'IDE ;
(4)Ctrl + F9 ;
(5) Exécuter -> Enregistrer le serveur ActiveX dans l'EDI ; // L'enregistrement de COM/COM+ peut également être effectué à l'aide de la ligne de commande.
2. Appelez COM/COM+ dans Delphi.net
(1) Dans l'EDI, Fichier -> Nouveau -> application Web asp.net,
Vous pourriez rencontrer de nombreux problèmes auxquels vous devrez faire face vous-même !
(2) Ajoutez une référence à COM/COM+ :
Dans le projet IDE ->Ajouter une référence -> Importations COM,
Sélectionnez le ComProject que vous venez d'enregistrer et cliquez sur Ajouter une référence pour ajouter une référence.
Cliquez sur OK (faites attention à votre fichier de projet (application Web ASP.NET)
Le chemin (Path) ne peut pas utiliser le chinois) ;
(3) Ajoutez ComProject aux utilisations dans WebForm1 ;
(4) Appeler COM/COM+
Placez deux contrôles Web au-dessus de WebForm1 : un bouton et une étiquette ;
Double-cliquez sur le bouton et écrivez dans le processus :
var
Message : chaîne ;
Obj : TObject ;
commencer
Obj := Server.CreateObject('ComProject.Test'); // Créer COM/COM+
Test(Obj).GetMsg(Msg); // Convertit Obj en Test et appelle la méthode GetMsg ;
Label1.Text := Msg;
fin;
(5) Ajoutez Aspcompat="true" à la ligne Page de WebForm1.aspx,
Par exemple : <%@ Page language="c#" Debug="true" Codebehind="WebForm1.pas" AutoEventWireup="false" Inherits="WebForm1.TWebForm1" Aspcompat="true"%>
(6) Ctrl + F9, Exécuter -> Exécuter (ou Exécuter sans débogage) ;
(7) Cliquez sur le bouton sur la page Web, est-ce fait ?
//Ce qui suit est la partie du code source :
Fichier de projet COM/COM+ (ComProject.dpr) :
bibliothèque ComProject ;
utilise
ComServ,
ComProject_TLB dans 'ComProject_TLB.pas',
Test dans 'Test.pas' {Test : CoClass} ;
exportations
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer ;
{$R *.TLB}
{$R *.RES}
commencer
fin.
//Unité de test COM/COM+ (Test.pas) :
Test unitaire ;
{$WARN SYMBOL_PLATFORM DÉSACTIVÉ}
interface
utilise
Windows, ActiveX, Classes, ComObj, ComProject_TLB, StdVcl ;
taper
TTest = classe (TTypedComObject, ITest)
protégé
fonction GetMsg (out Msg : WideString) : HResult ;
{Déclarez les méthodes ITest ici}
fin;
mise en œuvre
utilise ComServ ;
fonction TTest.GetMsg (out Msg : WideString) : HResult ;
commencer
Msg := 'Test Com/Com+ réussi !';
fin;
initialisation
TTypedComObjectFactory.Create(ComServer, TTest, Class_Test,
ciMultiInstance, tmApartment);
fin.
//Unité t de la bibliothèque de types COM/COM+ (ComProject_TLB.pas) :
unité ComProject_TLB ;
//************************************************ ********************** //
// AVERTISSEMENT
// -------
// Les types déclarés dans ce fichier ont été générés à partir des données lues depuis un
// Bibliothèque de types. Si cette bibliothèque de types est explicitement ou indirectement (via
// une autre bibliothèque de types faisant référence à cette bibliothèque de types) réimportée, ou le
// Commande 'Rafraîchir' de l'éditeur de bibliothèque de types activée lors de l'édition du
// Type Library, le contenu de ce fichier sera régénéré et tout
// les modifications manuelles seront perdues.
//************************************************ ********************** //
// PASTLWTR : 1.2
// Fichier généré le 2004-2-6 13:28:46 à partir de la bibliothèque de types décrite ci-dessous.
//************************************************ ********************** //
// Tapez Lib : D:/Program Files/Borland/Delphi7/Projects/comtest2/ComProject.tlb (1)
// LIBID : {92B46A1D-8A31-46C5-98FE-C03FEA98DC21}
//LCID : 0
// Fichier d'aide :
// HelpString : bibliothèque ComProject
//DepndLst :
// (1) version standard v2.0, (D:/WINDOWS/system32/stdole2.tlb)
//************************************************ ********************** //
{$TYPEDADDRESS OFF} // L'unité doit être compilée sans pointeurs de type vérifié.
{$WARN SYMBOL_PLATFORM DÉSACTIVÉ}
{$WRITEABLECONST SUR}
{$VARPROPSETTER ACTIVÉ}
interface
utilise Windows, ActiveX, Classes, Graphiques, StdVCL, Variantes ;
//************************************************ ********************//
// Les GUIDS déclarés dans la TypeLibrary. Les préfixes suivants sont utilisés :
// Bibliothèques de types : LIBID_xxxx
// CoClasses : CLASS_xxxx
// Interfaces DISP : DIID_xxxx
// Interfaces non-DISP : IID_xxxx
//************************************************ ********************//
const
// TypeLibrary Versions majeures et mineures
ComProjectMajorVersion = 1 ;
ComProjectMinorVersion = 0 ;
LIBID_ComProject : TGUID = '{92B46A1D-8A31-46C5-98FE-C03FEA98DC21}' ;
IID_ITest : TGUID = '{96CECA70-1438-4C54-982E-67C378F085E8}' ;
CLASS_Test : TGUID = '{CA54722F-C5EF-4814-A8DB-C1C357832F08}' ;
taper
//************************************************ ********************//
// Déclaration directe des types définis dans TypeLibrary
//************************************************ ********************//
ITest = interface ;
//************************************************ ********************//
// Déclaration des CoClasses définies dans la bibliothèque de types
// (REMARQUE : ici, nous mappons chaque CoClass à son interface par défaut)
//************************************************ ********************//
Test = ITest ;
//************************************************ ********************//
//Interface : ITest
// Indicateurs : (256) OleAutomation
// GUID : {96CECA70-1438-4C54-982E-67C378F085E8}
//************************************************ ********************//
ITest = interface (IInconnu)
['{96CECA70-1438-4C54-982E-67C378F085E8}']
fonction GetMsg (out Msg : WideString) : HResult ;
fin;
//************************************************ ********************//
// La classe CoTest fournit une méthode Create et CreateRemote pour
// crée des instances de l'interface par défaut ITest exposée par
// le test CoClass. Les fonctions sont destinées à être utilisées par.
// clients souhaitant automatiser les objets CoClass exposés par le
// serveur de cette bibliothèque de types.
//************************************************ ********************//
CoTest = classe
fonction de classe Créer : ITest ;
fonction de classe CreateRemote (const MachineName : string) : ITest ;
fin;
mise en œuvre
utiliseComObj ;
fonction de classe CoTest.Create : ITest ;
commencer
Résultat := CreateComObject(CLASS_Test) comme ITest ;
fin;
fonction de classe CoTest.CreateRemote (const MachineName : string) : ITest ;
commencer
Résultat := CreateRemoteComObject(MachineName, CLASS_Test) as ITest ;
fin;
fin.
//////////////////////////////////////Ce qui suit est le code source pour appeler COM/COM+ depuis Delphi.net/// ////////////////////////////
//Unité WebForm1.pas :
unité WebForm1 ;
interface
utilise
System.Collections, System.ComponentModel,
System.Data, System.Drawing, System.Web, System.Web.sessionState,
System.Web.UI, System.Web.UI.WebControls, System.Web.UI.HtmlControls,
ComProjet ;
taper
TWebForm1 = classe (System.Web.UI.Page)
{$REGION 'Code géré par le concepteur'}
strict privé
procédureInitializeComponent ;
procédure Button1_Click (expéditeur : System.Object ; e : System.EventArgs) ;
{$ENDREGION}
strict privé
procédure Page_Load (expéditeur : System.Object ; e : System.EventArgs) ;
strictement protégé
Bouton 1 : System.Web.UI.WebControls.Button ;
Étiquette1 : System.Web.UI.WebControls.Label ;
procédure OnInit(e: EventArgs);
privé
{Déclarations privées}
publique
{Déclarations publiques}
fin;
mise en œuvre
{$REGION 'Code géré par le concepteur'}
/// <résumé>
/// Méthode requise pour la prise en charge de Designer -- ne pas modifier
/// le contenu de cette méthode avec l'éditeur de code.
/// </summary>
procédure TWebForm1.InitializeComponent ;
commencer
Inclure (Self.Button1.Click, Self.Button1_Click);
Inclure (Self.Load, Self.Page_Load);
fin;
{$ENDREGION}
procédure TWebForm1.Page_Load(sender : System.Object ; e : System.EventArgs) ;
commencer
// TODO : Mettre le code utilisateur pour initialiser la page ici
fin;
procédure TWebForm1.OnInit(e: EventArgs);
commencer
//
// Requis pour la prise en charge de Designer
//
InitialiserComponent ;
héritéOnInit(e);
fin;
procédure TWebForm1.Button1_Click(expéditeur : System.Object; e : System.EventArgs) ;
var
Message : chaîne ;
Obj : TObject ;
commencer
Obj := Server.CreateObject('ComProject.Test');
Test(Obj).GetMsg(Msg);
Label1.Text := Msg;
fin;
fin.
///Unité WebForm1.aspx :
<%@ Page Language="c#" Debug="true" Codebehind="WebForm1.pas" AutoEventWireup="false" Inherits="WebForm1.TWebForm1" Aspcompat="true"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<tête>
<titre></titre>
<meta name="GENERATOR" content="Bibliothèque de packages Borland 7.1">
</tête>
<body ms_positioning="GridLayout">
<form runat="serveur">
<asp:identifiant du bouton=Bouton1
style="Z-INDEX : 1 ; GAUCHE : 238 px ; POSITION : absolue ; HAUT : 158 px"
runat="serveur" text="Bouton">
</asp:bouton>
<asp:ID d'étiquette=Étiquette1
style="Z-INDEX : 2 ; GAUCHE : 190 px ; POSITION : absolue ; HAUT : 54 px"
runat="server">Étiquette</asp:label>
</form>
</corps>
</html>