Das System des Kunden ist eine Kombination aus C/S und B/S. Der B/S-Teil sollte ursprünglich IntraWeb verwenden.
Delphi.net erschien zufällig, daher wurde der B/S-Teil auf Delphi.net umgestellt;
Während des Entwicklungsprozesses trat ein Problem auf: Der Verschlüsselungsalgorithmus wurde von Delphi 7 entwickelt.
Die Zeit war zu knapp und es war unmöglich, den Verschlüsselungsalgorithmus mit Delphi.net neu zu schreiben, also dachte ich an COM/COM+,
Schade, dass es auf Delphi.net nur sehr wenige Informationen und noch weniger Informationen zur Interoperabilität mit COM/COM+ gibt.
Also habe ich es selbst untersucht und bin auf Folgendes gekommen (Quellcode im Anhang):
1. Erstellen Sie COM/COM+ in Delphi 7
(1) In der IDE, Datei -> Neu -> Andere -> ActiveX -> ActiveX-Bibliothek,
Speichern Sie die Projektdatei als CompRoject;
(2) In der IDE Datei -> Neu -> Andere -> ActiveX -> COM-Objekt,
Füllen Sie „Test“ in der Spalte „Klassenname“ aus und speichern Sie die Einheit als „Test“.
(3) Fügen Sie einen Prozess namens GetMsg zu ITest in View -> Type Library in der IDE hinzu;
(4)Strg + F9;
(5) Ausführen -> ActiveX-Server in der IDE registrieren; // Die Registrierung von COM/COM+ kann auch über die Befehlszeile erfolgen
2. Rufen Sie COM/COM+ in Delphi.net auf
(1) In der IDE, Datei -> Neu -> asp.net-Webanwendung,
Möglicherweise stoßen Sie auf viele Probleme, mit denen Sie selbst fertig werden müssen!
(2) Fügen Sie einen Verweis auf COM/COM+ hinzu:
Im IDE-Projekt -> Referenz hinzufügen -> COM-Importe,
Wählen Sie das ComProject aus, das Sie gerade registriert haben, und klicken Sie auf Referenz hinzufügen, um eine Referenz hinzuzufügen.
Klicken Sie auf OK (Achten Sie auf Ihre Projektdatei (ASP.NET-Webanwendung).
Der Pfad (Pfad) kann kein Chinesisch verwenden.
(3) ComProject zu Verwendungen in WebForm1 hinzufügen;
(4) Rufen Sie COM/COM+ auf
Platzieren Sie zwei Websteuerelemente über WebForm1: eine Schaltfläche und eine Beschriftung.
Doppelklicken Sie auf den Button und schreiben Sie dabei:
var
Nachricht: string;
Obj: TObject;
beginnen
Obj := Server.CreateObject('ComProject.Test'); // COM/COM+ erstellen
Test(Obj).GetMsg(Msg); // Konvertieren Sie Obj in Test und rufen Sie die GetMsg-Methode auf;
Label1.Text := Msg;
Ende;
(5) Fügen Sie Aspcompat="true" zur Seitenzeile von WebForm1.aspx hinzu.
Beispiel: <%@ Page language="c#" Debug="true" Codebehind="WebForm1.pas" AutoEventWireup="false" Inherits="WebForm1.TWebForm1" Aspcompat="true"%>
(6)Strg + F9,Ausführen ->Ausführen (oder Ohne Debuggen ausführen);
(7) Klicken Sie auf die Schaltfläche auf der Webseite. Ist das erledigt?
//Das Folgende ist der Quellcode-Teil:
COM/COM+-Projektdatei (ComProject.dpr):
Bibliothek ComProject;
verwendet
ComServ,
ComProject_TLB in 'ComProject_TLB.pas',
Test in 'Test.pas' {Test: CoClass};
Exporte
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
{$R *.TLB}
{$R *.RES}
beginnen
Ende.
//COM/COM+ Testeinheit (Test.pas):
Unit-Test;
{$WARN SYMBOL_PLATFORM AUS}
Schnittstelle
verwendet
Windows, ActiveX, Klassen, ComObj, ComProject_TLB, StdVcl;
Typ
TTest = class(TTypedComObject, ITest)
geschützt
function GetMsg(out Msg: WideString): HResult;
{ITest-Methoden hier deklarieren}
Ende;
Durchführung
verwendet ComServ;
function TTest.GetMsg(out Msg: WideString): HResult;
beginnen
Msg := 'Com/Com+-Test erfolgreich!';
Ende;
Initialisierung
TTypedComObjectFactory.Create(ComServer, TTest, Class_Test,
ciMultiInstance, tmApartment);
Ende.
//COM/COM+ Typbibliothek T-Einheit (ComProject_TLB.pas):
Einheit ComProject_TLB;
//************************************************** ********************** //
// WARNUNG
// -------
// Die in dieser Datei deklarierten Typen wurden aus aus a gelesenen Daten generiert
// Typbibliothek. Wenn diese Typbibliothek explizit oder indirekt (über
// eine andere Typbibliothek, die auf diese Typbibliothek verweist) erneut importiert, oder die
// 'Aktualisieren'-Befehl des Typbibliothekseditors, der beim Bearbeiten aktiviert wird
// Typbibliothek, der Inhalt dieser Datei wird neu generiert und alle
// Manuelle Änderungen gehen verloren.
//************************************************** ********************** //
// PASTLWTR: 1.2
// Datei generiert am 6.2.2004 um 13:28:46 Uhr aus der unten beschriebenen Typbibliothek.
//************************************************** ********************** //
// Typ Lib: D:/Program Files/Borland/Delphi7/Projects/comtest2/ComProject.tlb (1)
// LIBID: {92B46A1D-8A31-46C5-98FE-C03FEA98DC21}
//LCID: 0
// Hilfedatei:
// HelpString: ComProject-Bibliothek
//DepndLst:
// (1) v2.0 stdole, (D:/WINDOWS/system32/stdole2.tlb)
//************************************************** ********************** //
{$TYPEDADDRESS OFF} // Unit muss ohne typgeprüfte Zeiger kompiliert werden.
{$WARN SYMBOL_PLATFORM AUS}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
Schnittstelle
verwendet Windows, ActiveX, Klassen, Grafiken, StdVCL, Varianten;
//************************************************** *********************//
// In der TypeLibrary deklarierte GUIDS. Folgende Präfixe werden verwendet:
// Typbibliotheken: LIBID_xxxx
// CoClasses: CLASS_xxxx
// DISPInterfaces: DIID_xxxx
// Nicht-DISP-Schnittstellen: IID_xxxx
//************************************************** *********************//
const
// TypeLibrary Haupt- und Nebenversionen
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}';
Typ
//************************************************** *********************//
// Deklaration der in TypeLibrary definierten Typen weiterleiten
//************************************************** *********************//
ITest = Schnittstelle;
//************************************************** *********************//
// Deklaration der in der Typbibliothek definierten CoClasses
// (HINWEIS: Hier ordnen wir jede CoClass ihrer Standardschnittstelle zu)
//************************************************** *********************//
Test = ITest;
//************************************************** *********************//
//Schnittstelle: ITest
// Flags: (256) OleAutomation
// GUID: {96CECA70-1438-4C54-982E-67C378F085E8}
//************************************************** *********************//
ITest = Schnittstelle (IUnknown)
['{96CECA70-1438-4C54-982E-67C378F085E8}']
function GetMsg(out Msg: WideString): HResult;
Ende;
//************************************************** *********************//
// Die Klasse CoTest stellt eine Create- und CreateRemote-Methode bereit
// Instanzen der Standardschnittstelle ITest erstellen, die von bereitgestellt wird
// der CoClass-Test. Die Funktionen sollen von verwendet werden
// Clients, die die von der bereitgestellten CoClass-Objekte automatisieren möchten
// Server dieser Typbibliothek.
//************************************************** *********************//
CoTest = Klasse
Klassenfunktion Erstellen: ITest;
Klassenfunktion CreateRemote(const MachineName: string): ITest;
Ende;
Durchführung
nutztComObj;
Klassenfunktion CoTest.Create: ITest;
beginnen
Ergebnis := CreateComObject(CLASS_Test) as ITest;
Ende;
Klassenfunktion CoTest.CreateRemote(const MachineName: string): ITest;
beginnen
Ergebnis := CreateRemoteComObject(MachineName, CLASS_Test) as ITest;
Ende;
Ende.
//////////////////////////////////////Das Folgende ist der Quellcode für den Aufruf von COM/COM+ von Delphi.net/// ///////////////////////////
//WebForm1.pas-Einheit:
Einheit WebForm1;
Schnittstelle
verwendet
System.Collections, System.ComponentModel,
System.Data, System.Drawing, System.Web, System.Web.sessionState,
System.Web.UI, System.Web.UI.WebControls, System.Web.UI.HtmlControls,
ComProject;
Typ
TWebForm1 = class(System.Web.UI.Page)
{$REGION 'Vom Designer verwalteter Code'}
streng privat
procedureInitializeComponent;
procedure Button1_Click(sender: System.Object; e: System.EventArgs);
{$ENDREGION}
streng privat
procedure Page_Load(sender: System.Object; e: System.EventArgs);
streng geschützt
Button1: System.Web.UI.WebControls.Button;
Label1: System.Web.UI.WebControls.Label;
procedure OnInit(e: EventArgs);
Privat
{Private Erklärungen}
öffentlich
{Öffentliche Erklärungen}
Ende;
Durchführung
{$REGION 'Vom Designer verwalteter Code'}
/// <Zusammenfassung>
/// Erforderliche Methode für Designer-Unterstützung – nicht ändern
/// den Inhalt dieser Methode mit dem Code-Editor.
/// </summary>
procedure TWebForm1.InitializeComponent;
beginnen
Include(Self.Button1.Click, Self.Button1_Click);
Include(Self.Load, Self.Page_Load);
Ende;
{$ENDREGION}
procedure TWebForm1.Page_Load(sender: System.Object; e: System.EventArgs);
beginnen
// TODO: Geben Sie hier den Benutzercode ein, um die Seite zu initialisieren
Ende;
procedure TWebForm1.OnInit(e: EventArgs);
beginnen
//
// Erforderlich für Designer-Unterstützung
//
InitializeComponent;
inheritedOnInit(e);
Ende;
procedure TWebForm1.Button1_Click(sender: System.Object; e: System.EventArgs);
var
Nachricht: string;
Obj: TObject;
beginnen
Obj := Server.CreateObject('ComProject.Test');
Test(Obj).GetMsg(Msg);
Label1.Text := Msg;
Ende;
Ende.
///WebForm1.aspx-Einheit:
<%@ 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>
<Kopf>
<title></title>
<meta name="GENERATOR" content="Borland Package Library 7.1">
</head>
<body ms_positioning="GridLayout">
<form runat="server">
<asp:button id=Button1
style="Z-INDEX: 1; LINKS: 238px; POSITION: absolut; OBEN: 158px"
runat="server" text="Button">
</asp:button>
<asp:label id=Label1
style="Z-INDEX: 2; LINKS: 190px; POSITION: absolut; OBEN: 54px"
runat="server">Label</asp:label>
</form>
</body>
</html>