O sistema do cliente é uma combinação de C/S e B/S. A parte B/S foi originalmente planejada para usar IntraWeb.
Delphi.net apareceu, então a parte B/S foi trocada para Delphi.net;
Surgiu um problema durante o processo de desenvolvimento: o algoritmo de criptografia foi desenvolvido pelo Delphi 7.
O tempo estava muito curto e era impossível reescrever o algoritmo de criptografia usando Delphi.net, então pensei em COM/COM+,
É uma pena que haja muito pouca informação no Delphi.net, e ainda menos informação sobre interoperabilidade com COM/COM+.
Então eu mesmo explorei e descobri o seguinte (código-fonte anexado):
1. Crie COM/COM+ no Delphi 7
(1) No IDE, Arquivo -> Novo -> Outro -> ActiveX -> Biblioteca ActiveX,
Salve o arquivo do projeto como CompRoject;
(2) No IDE, Arquivo -> Novo -> Outro -> ActiveX -> Objeto COM,
Preencha Teste na coluna Nome da Classe e salve a unidade como Teste;
(3) Adicione um processo chamado GetMsg ao ITest em View -> Type Library no IDE;
(4)Ctrl+F9;
(5) Executar -> Registrar Servidor ActiveX no IDE // O registro do COM/COM+ também pode ser feito usando a linha de comando;
2. Chame COM/COM+ em Delphi.net
(1) No IDE, Arquivo -> Novo -> aplicativo Web asp.net,
Você pode encontrar muitos problemas com os quais terá que lidar sozinho!
(2) Adicione uma referência ao COM/COM+:
No projeto IDE -> Adicionar referência -> Importações COM,
Selecione o ComProject que você acabou de registrar e clique em Adicionar Referência para adicionar uma referência.
Clique em OK (preste atenção ao seu arquivo de projeto (aplicativo Web ASP.NET)
O caminho (Path) não pode usar chinês);
(3) Adicionar ComProject aos usos no WebForm1;
(4) Ligue COM/COM+
Coloque dois controles da Web acima do WebForm1: um botão e um rótulo;
Clique duas vezes no botão e escreva no processo:
var
Mensagem: string;
Obj: TObject;
começar
Obj := Server.CreateObject('ComProject.Test'); // Cria COM/COM+);
Test(Obj).GetMsg(Msg); // Converte Obj em Teste e chama o método GetMsg;
Label1.Text := Mensagem;
fim;
(5) Adicione Aspcompat="true" à linha Page de WebForm1.aspx,
Por exemplo: <%@ Page language="c#" Debug="true" Codebehind="WebForm1.pas" AutoEventWireup="false" Inherits="WebForm1.TWebForm1" Aspcompat="true"%>
(6)Ctrl + F9,Executar ->Executar (ou Executar sem depuração);
(7) Clique no botão na página da web, pronto?
//A seguir está a parte do código-fonte:
Arquivo de projeto COM/COM+ (ComProject.dpr):
biblioteca ComProject;
usa
ComServ,
ComProject_TLB em 'ComProject_TLB.pas',
Teste em 'Test.pas' {Test: CoClass};
exportações
DllGetClassObject,
DllCanUnloadAgora,
DllRegisterServer,
DllUnregisterServer;
{$R *.TLB}
{$R *.RES}
começar
fim.
//Unidade de teste COM/COM+ (Test.pas):
Teste unitário;
{$WARN SYMBOL_PLATFORM DESLIGADO}
interface
usa
Windows, ActiveX, Classes, ComObj, ComProject_TLB, StdVcl;
tipo
TTest = classe(TTypedComObject, ITest)
protegido
função GetMsg (mensagem de saída: WideString): HResult;
{Declare métodos ITest aqui}
fim;
implementação
usa ComServ;
função TTest.GetMsg(mensagem de saída: WideString): HResult;
começar
Mensagem := 'Teste Com/Com+ bem sucedido!';
fim;
inicialização
TTypedComObjectFactory.Create(ComServer, TTest, Class_Test,
ciMultiInstance, tmApartment);
fim.
//Unidade t da biblioteca de tipos COM/COM+ (ComProject_TLB.pas):
unidade ComProject_TLB;
//************************************************ ********************** //
// AVISO
// -------
// Os tipos declarados neste arquivo foram gerados a partir de dados lidos de um
// Biblioteca de tipos. Se esta biblioteca de tipos for explícita ou indireta (via
//outra biblioteca de tipos referente a esta biblioteca de tipos) reimportada, ou o
// Comando 'Atualizar' do Type Library Editor ativado durante a edição do
// Digite Biblioteca, o conteúdo deste arquivo será regenerado e todos
// modificações manuais serão perdidas.
//************************************************ ********************** //
//PASTLWTR: 1.2
// Arquivo gerado em 2004-2-6 13:28:46 da Type Library descrita abaixo.
//************************************************ ********************** //
// Digite Lib: D:/Arquivos de Programas/Borland/Delphi7/Projects/comtest2/ComProject.tlb (1)
// LÍBIDO: {92B46A1D-8A31-46C5-98FE-C03FEA98DC21}
//LCID: 0
//Arquivo de ajuda:
// HelpString: Biblioteca ComProject
//DepndLst:
// (1) stdole v2.0, (D:/WINDOWS/system32/stdole2.tlb)
//************************************************ ********************** //
{$TYPEDADDRESS OFF} // A unidade deve ser compilada sem ponteiros de verificação de tipo.
{$WARN SYMBOL_PLATFORM DESLIGADO}
{$WRITEABLECONST ON}
{$VARPROPSETTERON}
interface
usa Windows, ActiveX, Classes, Gráficos, StdVCL, Variantes;
//************************************************ *********************//
// GUIDS declarados na TypeLibrary. Os seguintes prefixos são usados:
// Bibliotecas de tipos: LIBID_xxxx
// CoClasses: CLASS_xxxx
//DispInterfaces: DIID_xxxx
// Interfaces não DISP: IID_xxxx
//************************************************ *********************//
const
// TypeLibrary Versões principais e secundárias
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
//************************************************ *********************//
//Declaração direta de tipos definidos em TypeLibrary
//************************************************ *********************//
ITest = interface;
//************************************************ *********************//
//Declaração de CoClasses definidas na Type Library
// (NOTA: Aqui mapeamos cada CoClass para sua interface padrão)
//************************************************ *********************//
Teste = ITeste;
//************************************************ *********************//
//Interface: ITest
// Sinalizadores: (256) OleAutomation
// GUID: {96CECA70-1438-4C54-982E-67C378F085E8}
//************************************************ *********************//
ITest = interface(IUnknown)
['{96CECA70-1438-4C54-982E-67C378F085E8}']
função GetMsg (mensagem de saída: WideString): HResult;
fim;
//************************************************ *********************//
// A classe CoTest fornece um método Create e CreateRemote para
// cria instâncias da interface padrão ITest exposta por
// o teste CoClass As funções devem ser usadas por.
// clientes que desejam automatizar os objetos CoClass expostos pelo
// servidor deste tipolibrary.
//************************************************ *********************//
CoTest = turma
função de classe Criar: ITest;
função de classe CreateRemote (const MachineName: string): ITest;
fim;
implementação
usaComObj;
função de classe CoTest.Create: ITest;
começar
Resultado: = CreateComObject (CLASS_Test) como ITest;
fim;
função de classe CoTest.CreateRemote (const MachineName: string): ITest;
começar
Resultado: = CreateRemoteComObject (MachineName, CLASS_Test) como ITest;
fim;
fim.
//////////////////////////////////// O seguinte é o código fonte para chamar COM/COM+ de Delphi.net/// //////////////////////////
//Unidade WebForm1.pas:
unidade WebForm1;
interface
usa
System.Collections, System.ComponentModel,
System.Data, System.Drawing, System.Web, System.Web.sessionState,
System.Web.UI, System.Web.UI.WebControls, System.Web.UI.HtmlControls,
ComProjeto;
tipo
TWebForm1 = classe(System.Web.UI.Página)
{$REGION 'Código Gerenciado pelo Designer'}
estritamente privado
procedimentoInitializeComponent;
procedimento Button1_Click(remetente: System.Object; e: System.EventArgs);
{$ENDREGION}
estritamente privado
procedimento Page_Load(remetente: System.Object; e: System.EventArgs);
estritamente protegido
Botão1: System.Web.UI.WebControls.Button;
Rótulo1: System.Web.UI.WebControls.Label;
procedimento OnInit(e: substituição de EventArgs);
privado
{Declarações privadas}
público
{Declarações Públicas}
fim;
implementação
{$REGION 'Código Gerenciado pelo Designer'}
/// <resumo>
/// Método necessário para suporte do Designer – não modifique
/// o conteúdo deste método com o editor de código.
/// </sumário>
procedimento TWebForm1.InitializeComponent;
começar
Incluir(Self.Button1.Click, Self.Button1_Click);
Incluir(Self.Load, Self.Page_Load);
fim;
{$ENDREGION}
procedimento TWebForm1.Page_Load(remetente: System.Object; e: System.EventArgs);
começar
//TODO: Coloque aqui o código do usuário para inicializar a página
fim;
procedimento TWebForm1.OnInit(e: EventArgs);
começar
//
// Necessário para suporte do Designer
//
InicializarComponent;
herdadoOnInit(e);
fim;
procedimento TWebForm1.Button1_Click(remetente: System.Object; e: System.EventArgs);
var
Mensagem: string;
Obj: TObject;
começar
Obj := Server.CreateObject('ComProject.Test');
Teste(Obj).GetMsg(Msg);
Label1.Text := Mensagem;
fim;
fim.
///Unidade 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>
<cabeça>
<título></título>
<meta name="GENERATOR" content="Biblioteca de Pacotes Borland 7.1">
</head>
<body ms_positioning="GridLayout">
<form runat="servidor">
<asp:botão id=Botão1
style="Z-INDEX: 1; ESQUERDA: 238px; POSIÇÃO: absoluta; SUPERIOR: 158px"
runat="servidor" text="Botão">
</asp:botão>
<asp:rótulo id=Rótulo1
style="Z-INDEX: 2; ESQUERDA: 190px; POSIÇÃO: absoluta; SUPERIOR: 54px"
runat="servidor">Rótulo</asp:label>
</form>
</body>
</html>