El sistema del cliente es una combinación de C/S y B/S. Inicialmente se planeó que la parte B/S utilizara IntraWeb.
Apareció Delphi.net, por lo que la parte B/S se cambió a Delphi.net;
Durante el proceso de desarrollo surgió un problema: el algoritmo de cifrado fue desarrollado por Delphi 7.
El tiempo era demasiado escaso y era imposible reescribir el algoritmo de cifrado usando Delphi.net, así que pensé en COM/COM+.
Es una lástima que haya muy poca información en Delphi.net, y aún menos información sobre la interoperabilidad con COM/COM+.
Así que lo exploré yo mismo y se me ocurrió lo siguiente (código fuente adjunto):
1. Crear COM/COM+ en Delphi 7
(1) En el IDE, Archivo -> Nuevo -> Otro -> ActiveX -> Biblioteca ActiveX,
Guarde el archivo del proyecto como CompRoject;
(2) En el IDE, Archivo -> Nuevo -> Otro -> ActiveX -> Objeto COM,
Complete Prueba en la columna Nombre de clase y guarde la unidad como Prueba;
(3) Agregue un proceso llamado GetMsg a ITest en Ver -> Biblioteca de tipos en el IDE;
(4) Ctrl + F9;
(5) Ejecutar -> Registrar servidor ActiveX en el IDE // El registro de COM/COM+ también se puede realizar mediante la línea de comando;
2. Llame a COM/COM+ en Delphi.net
(1) En el IDE, Archivo -> Nuevo -> aplicación web asp.net,
¡Es posible que encuentres muchos problemas con los que tendrás que lidiar tú mismo!
(2) Agregue una referencia a COM/COM+:
En el Proyecto IDE ->Agregar referencia -> Importaciones COM,
Seleccione el ComProject que acaba de registrar y haga clic en Agregar referencia para agregar una referencia.
Haga clic en Aceptar (preste atención al archivo de su proyecto (aplicación web ASP.NET)
La ruta (Ruta) no puede usar chino);
(3) Agregar ComProject para usos en WebForm1;
(4) Llamar COM/COM+
Coloque dos controles web encima de WebForm1: un botón y una etiqueta;
Haga doble clic en el Botón y escriba en el proceso:
var
Mensaje: cadena;
Objeto: TObjeto;
comenzar
Obj := Server.CreateObject('ComProject.Test'); // Crear COM/COM+
Test(Obj).GetMsg(Msg); // Convierte Obj en Prueba y llama al método GetMsg;
Etiqueta1.Texto := Mensaje;
fin;
(5) Agregue Aspcompat="true" a la línea de página de WebForm1.aspx,
Por ejemplo: <%@ Idioma de página="c#" Debug="true" Codebehind="WebForm1.pas" AutoEventWireup="false" Inherits="WebForm1.TWebForm1" Aspcompat="true"%>
(6)Ctrl + F9,Ejecutar ->Ejecutar (o Ejecutar sin depurar);
(7) Haga clic en el botón en la página web. ¿Está listo?
//La siguiente es la parte del código fuente:
Archivo de proyecto COM/COM+ (ComProject.dpr):
biblioteca ComProject;
usos
servicio de comunicaciones,
ComProject_TLB en 'ComProject_TLB.pas',
Prueba en 'Test.pas' {Prueba: CoClass};
exportaciones
DllGetClassObjeto,
DllCanDescargar ahora,
servidor dllregister,
DllUnregisterServer;
{$R *.TLB}
{$R*.RES}
comenzar
fin.
//COM/COM+ Unidad de prueba (Test.pas):
prueba unitaria;
{$WARN SYMBOL_PLATFORM APAGADO}
interfaz
usos
Windows, ActiveX, Clases, ComObj, ComProject_TLB, StdVcl;
tipo
TTest = clase(TTypedComObject, ITest)
protegido
función GetMsg (mensaje de salida: WideString): HResult; stdcall;
{Declarar métodos de prueba aquí}
fin;
implementación
utiliza ComServ;
función TTest.GetMsg (mensaje de salida: WideString): HResult;
comenzar
Mensaje := '¡Prueba Com/Com+ exitosa!';
fin;
inicialización
TTypedComObjectFactory.Create(ComServer, TTest, Class_Test,
ciMultiInstancia, tmApartamento);
fin.
// Unidad t de biblioteca de tipos COM/COM+ (ComProject_TLB.pas):
unidad ComProject_TLB;
//************************************************ ********************** //
// ADVERTENCIA
// -------
// Los tipos declarados en este archivo se generaron a partir de datos leídos de un
// Biblioteca de tipos. Si esta biblioteca de tipos es explícita o indirectamente (a través de
// otra biblioteca de tipos que hace referencia a esta biblioteca de tipos) reimportada, o la
// El comando 'Actualizar' del Editor de biblioteca de tipos se activó mientras se editaba el
// Escriba Biblioteca, el contenido de este archivo se regenerará y todos
// las modificaciones manuales se perderán.
//************************************************ ********************** //
// PASTLWTR: 1.2
// Archivo generado el 2004-2-6 13:28:46 desde la biblioteca de tipos que se describe a continuación.
//************************************************ ********************** //
// Escriba Lib: D:/Archivos de programa/Borland/Delphi7/Projects/comtest2/ComProject.tlb (1)
// LIBIDO: {92B46A1D-8A31-46C5-98FE-C03FEA98DC21}
//LCID: 0
// archivo de ayuda:
// Cadena de ayuda: Biblioteca ComProject
//ListaDependencia:
// (1) v2.0 stdole, (D:/WINDOWS/system32/stdole2.tlb)
//************************************************ ********************** //
{$TYPEDADDRESS OFF} // La unidad debe compilarse sin punteros verificados.
{$WARN SYMBOL_PLATFORM APAGADO}
{$WRITEABLECONST ON}
{$VARPROPSETTER ENCENDIDO}
interfaz
utiliza Windows, ActiveX, Clases, Gráficos, StdVCL, Variantes;
//************************************************ **********************//
// GUIDS declarados en TypeLibrary. Se utilizan los siguientes prefijos:
// Bibliotecas de tipos: LIBID_xxxx
// Coclases: CLASS_xxxx
// DISPInterfaces: DIID_xxxx
// Interfaces no DISP: IID_xxxx
//************************************************ **********************//
constante
// TypeLibrary Versiones mayores y menores
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}';
tipo
//************************************************ **********************//
// Declaración directa de tipos definidos en TypeLibrary
//************************************************ **********************//
Prueba de TI = interfaz;
//************************************************ **********************//
// Declaración de CoClasses definidas en la biblioteca de tipos
// (NOTA: Aquí asignamos cada CoClass a su interfaz predeterminada)
//************************************************ **********************//
Prueba = Prueba de TI;
//************************************************ **********************//
//Interfaz: Prueba de TI
// Banderas: (256) OleAutomation
// GUID: {96CECA70-1438-4C54-982E-67C378F085E8}
//************************************************ **********************//
ITest = interfaz(IUDesconocido)
['{96CECA70-1438-4C54-982E-67C378F085E8}']
función GetMsg (mensaje de salida: WideString): HResult; stdcall;
fin;
//************************************************ **********************//
// La clase CoTest proporciona un método Create y CreateRemote para
// crea instancias de la interfaz predeterminada ITest expuesta por
// la prueba CoClass Las funciones están destinadas a ser utilizadas por
// clientes que desean automatizar los objetos CoClass expuestos por el
// servidor de esta biblioteca de tipos.
//************************************************ **********************//
CoTest = clase
función de clase Crear: ITest;
función de clase CreateRemote(const MachineName: cadena): ITest;
fin;
implementación
utilizaComObj;
función de clase CoTest.Create: ITest;
comenzar
Resultado: = CreateComObject(CLASS_Test) como ITest;
fin;
función de clase CoTest.CreateRemote(const MachineName: string): ITest;
comenzar
Resultado: = CreateRemoteComObject(MachineName, CLASS_Test) como ITest;
fin;
fin.
//////////////////////////////////////// El siguiente es el código fuente para llamar a COM/COM+ de Delphi.net/// ////////////////////////////
//Unidad WebForm1.pas:
unidad WebForm1;
interfaz
usos
Sistema.Colecciones, Sistema.ComponentModel,
System.Data, System.Drawing, System.Web, System.Web.sessionState,
Sistema.Web.UI, Sistema.Web.UI.WebControls, Sistema.Web.UI.HtmlControls,
Proyecto Com;
tipo
TWebForm1 = clase(System.Web.UI.Page)
{$REGION 'Código administrado por el diseñador'}
estricto privado
procedimientoInitializeComponent;
procedimiento Button1_Click(remitente: System.Object; e: System.EventArgs);
{$ENDREGIÓN}
estricto privado
procedimiento Page_Load(remitente: System.Object; e: System.EventArgs);
estrictamente protegido
Botón1: System.Web.UI.WebControls.Button;
Etiqueta1: System.Web.UI.WebControls.Label;
procedimiento OnInit(e: EventArgs);
privado
{Declaraciones Privadas}
público
{Declaraciones públicas}
fin;
implementación
{$REGION 'Código administrado por el diseñador'}
/// <resumen>
/// Método requerido para la compatibilidad con Designer: no modificar
/// el contenido de este método con el editor de código.
/// </summary>
procedimiento TWebForm1.InitializeComponent;
comenzar
Incluir (Self.Button1.Click, Self.Button1_Click);
Incluir (Self.Load, Self.Page_Load);
fin;
{$ENDREGIÓN}
procedimiento TWebForm1.Page_Load(remitente: System.Object; e: System.EventArgs);
comenzar
// TODO: Pon el código de usuario para inicializar la página aquí
fin;
procedimiento TWebForm1.OnInit(e: EventArgs);
comenzar
//
// Requerido para el soporte del Diseñador
//
InicializarComponente;
heredadoOnInit(e);
fin;
procedimiento TWebForm1.Button1_Click(remitente: System.Object; e: System.EventArgs);
var
Mensaje: cadena;
Objeto: TObjeto;
comenzar
Obj := Server.CreateObject('ComProject.Test');
Prueba(Obj).GetMsg(Msg);
Etiqueta1.Texto := Mensaje;
fin;
fin.
///Unidad WebForm1.aspx:
<%@ Idioma de la página="c#" Debug="true" Codebehind="WebForm1.pas" AutoEventWireup="false" Inherits="WebForm1.TWebForm1" Aspcompat="true"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transicional//ES">
<html>
<cabeza>
<título></título>
<meta name="GENERADOR" contenido="Biblioteca de paquetes Borland 7.1">
</cabeza>
<cuerpo ms_positioning="GridLayout">
<formulario runat="servidor">
<asp:id del botón=Botón1
estilo="ÍNDICE Z: 1; IZQUIERDA: 238px; POSICIÓN: absoluta; ARRIBA: 158px"
runat="servidor" text="Botón">
</asp:botón>
<asp:id de etiqueta=Etiqueta1
estilo="ÍNDICE Z: 2; IZQUIERDA: 190px; POSICIÓN: absoluta; ARRIBA: 54px"
runat="servidor">Etiqueta</asp:etiqueta>
</formulario>
</cuerpo>
</html>