Sistem pelanggan merupakan kombinasi C/S dan B/S. Bagian B/S awalnya direncanakan menggunakan IntraWeb.
Delphi.net kebetulan muncul, jadi bagian B/S dialihkan ke Delphi.net;
Masalah muncul selama proses pengembangan: algoritma enkripsi dikembangkan oleh Delphi 7.
Waktu terlalu sempit dan tidak mungkin untuk menulis ulang algoritma enkripsi menggunakan Delphi.net, jadi saya memikirkan COM/COM+,
Sayangnya hanya ada sedikit informasi di Delphi.net, apalagi informasi tentang interoperabilitas dengan COM/COM+.
Jadi saya menjelajahinya sendiri dan menghasilkan yang berikut (kode sumber terlampir):
1. Buat COM/COM+ di Delphi 7
(1) Di IDE, File -> Baru -> Lainnya -> ActiveX -> Perpustakaan ActiveX,
Simpan file proyek sebagai CompRoject;
(2) Di IDE, File -> Baru -> Lainnya -> ActiveX -> Objek COM,
Isikan Test pada kolom Nama Kelas dan simpan unit sebagai Test;
(3) Tambahkan proses bernama GetMsg ke ITest di View -> Type Library di IDE;
(4)Ctrl + F9;
(5) Jalankan -> Daftarkan Server ActiveX di IDE; // Mendaftarkan COM/COM+ juga dapat dilakukan menggunakan baris perintah
2. Hubungi COM/COM+ di Delphi.net
(1) Di IDE, File -> Baru -> aplikasi Web asp.net,
Anda mungkin menghadapi banyak masalah yang harus Anda atasi sendiri!
(2) Tambahkan referensi ke COM/COM+:
Di Proyek IDE ->Tambahkan Referensi -> Impor COM,
Pilih ComProject yang baru saja Anda daftarkan dan klik Tambahkan Referensi untuk menambahkan referensi.
Klik OK (Perhatikan file proyek Anda (ASP.NET Web Application)
Jalur (Path) tidak bisa menggunakan bahasa Mandarin);
(3) Tambahkan ComProject untuk digunakan di WebForm1;
(4) Hubungi COM/COM+
Letakkan dua Kontrol Web di atas WebForm1: Tombol dan Label;
Klik dua kali Tombol dan tulis dalam prosesnya:
var
Pesan: tali;
Obj: TObjek;
mulai
Obj := Server.CreateObject('ComProject.Test'); // Buat COM/COM+
Test(Obj).GetMsg(Msg); // Ubah Obj menjadi Test dan panggil metode GetMsg;
Label1.Teks := Pesan;
akhir;
(5) Tambahkan Aspcompat="true" ke baris Halaman WebForm1.aspx,
Misalnya: <%@ Halaman bahasa = "c #" Debug = "benar" Codebehind = "WebForm1.pas" AutoEventWireup = "false" Inherits = "WebForm1.TWebForm1" Aspcompat = "benar"%>
(6)Ctrl + F9,Run ->Run (atau Jalankan Tanpa Debugging);
(7) Klik Tombol pada halaman web, apakah sudah selesai?
//Berikut ini adalah bagian kode sumbernya:
File proyek COM/COM+ (ComProject.dpr):
proyek perpustakaan;
kegunaan
ComServ,
ComProject_TLB di 'ComProject_TLB.pas',
Tes di 'Test.pas' {Test: CoClass};
ekspor
DllGetClassObject,
DllDapat Bongkar Sekarang,
DllRegisterServer,
DllBatalkan RegistrasiServer;
{$R *.TLB}
{$R *.RES}
mulai
akhir.
//COM/COM+ Unit pengujian (Tes.pas):
Uji satuan;
{$PERINGATAN SYMBOL_PLATFORM MATI}
antarmuka
kegunaan
Windows, ActiveX, Kelas, ComObj, ComProject_TLB, StdVcl;
jenis
Tes TT = kelas(TTypedComObject, ITest)
terlindung
fungsi GetMsg(Pesan keluar: WideString): HResult;
{Deklarasikan metode pengujian di sini}
akhir;
pelaksanaan
menggunakan ComServ;
fungsi TTest.GetMsg(Pesan keluar: WideString): HResult;
mulai
Pesan := 'Tes Com/Com+ berhasil!';
akhir;
inisialisasi
TTypedComObjectFactory.Create(ComServer, TTest, Class_Test,
ciMultiInstance, tmApartment);
akhir.
//COM/COM+ tipe perpustakaan t unit (ComProject_TLB.pas):
unit ComProject_TLB;
//****************************************************** ********************* //
// PERINGATAN
// -------
// Tipe yang dideklarasikan dalam file ini dihasilkan dari data yang dibaca dari a
// Ketik Perpustakaan. Jika perpustakaan tipe ini secara eksplisit atau tidak langsung (melalui
// perpustakaan tipe lain yang mengacu pada perpustakaan tipe ini) diimpor ulang, atau
// Perintah 'Refresh' pada Type Library Editor diaktifkan saat mengedit
// Ketik Library, isi file ini akan dibuat ulang dan semuanya
// modifikasi manual akan hilang.
//****************************************************** ********************* //
// PASTLWTR: 1.2
// File dihasilkan pada 2004-2-6 13:28:46 dari Type Library yang dijelaskan di bawah.
//****************************************************** ********************* //
// Ketik Lib: D:/Program Files/Borland/Delphi7/Projects/comtest2/ComProject.tlb (1)
// LIBID: {92B46A1D-8A31-46C5-98FE-C03FEA98DC21}
//LCID: 0
// File Bantuan:
// HelpString: Perpustakaan Proyek Com
//DepndLst:
// (1) v2.0 stdole, (D:/WINDOWS/system32/stdole2.tlb)
//****************************************************** ********************* //
{$TYPEDADDRESS OFF} // Unit harus dikompilasi tanpa pointer yang dicentang tipenya.
{$PERINGATAN SYMBOL_PLATFORM MATI}
{$WRITEABLECONST AKTIF}
{$VARPROPSETTER AKTIF}
antarmuka
menggunakan Windows, ActiveX, Kelas, Grafik, StdVCL, Varian;
//****************************************************** *********************//
// GUIDS dideklarasikan di TypeLibrary. Awalan berikut digunakan:
// Ketik Perpustakaan: LIBID_xxxx
// Kelas Bersama : CLASS_xxxx
// Antarmuka DISP : DIID_xxxx
// Antarmuka non-DISP: IID_xxxx
//****************************************************** *********************//
konstanta
// TypeLibrary Versi mayor dan minor
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}';
jenis
//****************************************************** *********************//
// Meneruskan deklarasi tipe yang ditentukan di TypeLibrary
//****************************************************** *********************//
ITest = antarmuka;
//****************************************************** *********************//
// Deklarasi CoClasses yang ditentukan di Type Library
// (CATATAN: Di sini kita memetakan setiap CoClass ke Antarmuka Defaultnya)
//****************************************************** *********************//
Tes = Tes I;
//****************************************************** *********************//
//Antarmuka: ITtest
// Bendera: (256) OleAutomation
// PANDUAN: {96CECA70-1438-4C54-982E-67C378F085E8}
//****************************************************** *********************//
ITest = antarmuka(ITidak diketahui)
['{96CECA70-1438-4C54-982E-67C378F085E8}']
fungsi GetMsg(Pesan keluar: WideString): HResult;
akhir;
//****************************************************** *********************//
// Class CoTest menyediakan metode Create dan CreateRemote untuk
// membuat instance antarmuka default yang diekspos oleh ITest
// Tes CoClass. Fungsi ini dimaksudkan untuk digunakan oleh
// klien yang ingin mengotomatiskan objek CoClass yang diekspos oleh
// server dari perpustakaan jenis ini.
//****************************************************** *********************//
CoTest = kelas
fungsi kelas Buat: ITest;
fungsi kelas CreateRemote(const MachineName: string): ITest;
akhir;
pelaksanaan
menggunakanComObj;
fungsi kelas CoTest.Buat: ITest;
mulai
Hasil := CreateComObject(CLASS_Test) sebagai ITest;
akhir;
fungsi kelas CoTest.CreateRemote(const MachineName: string): ITest;
mulai
Hasil := CreateRemoteComObject(MachineName, CLASS_Test) sebagai ITest;
akhir;
akhir.
/////////////////////////////////////////Berikut ini adalah kode sumber untuk memanggil COM/COM+ dari Delphi.net/// /////////////////////////////
//Unit WebForm1.pas:
satuan WebForm1;
antarmuka
kegunaan
Sistem.Koleksi, Sistem.ComponentModel,
Sistem.Data, Sistem.Gambar, Sistem.Web, Sistem.Web.sessionState,
Sistem.Web.UI, Sistem.Web.UI.WebControls, Sistem.Web.UI.HtmlControls,
Proyek Com;
jenis
TWebForm1 = kelas(Sistem.Web.UI.Halaman)
{$REGION 'Kode yang Dikelola Desainer'}
pribadi yang ketat
procedureInitializeComponent;
procedure Button1_Click(pengirim: System.Object; e: System.EventArgs);
{$ENDREGION}
pribadi yang ketat
procedure Page_Load(pengirim: System.Object; e: System.EventArgs);
dilindungi secara ketat
Tombol1: Sistem.Web.UI.WebControls.Button;
Label1: Sistem.Web.UI.WebControls.Label;
prosedur OnInit(e: EventArgs override;
pribadi
{Deklarasi Pribadi}
publik
{Deklarasi Publik}
akhir;
pelaksanaan
{$REGION 'Kode yang Dikelola Desainer'}
/// <ringkasan>
/// Metode yang diperlukan untuk dukungan Desainer -- jangan diubah
/// isi metode ini dengan editor kode.
/// </ringkasan>
prosedur TWebForm1.InitializeComponent;
mulai
Sertakan(Self.Button1.Click, Self.Button1_Click);
Sertakan(Self.Load, Self.Page_Load);
akhir;
{$ENDREGION}
procedure TWebForm1.Page_Load(pengirim: System.Object; e: System.EventArgs);
mulai
// TODO: Masukkan kode pengguna untuk menginisialisasi halaman di sini
akhir;
prosedur TWebForm1.OnInit(e: EventArgs);
mulai
//
// Diperlukan untuk dukungan Desainer
//
Inisialisasi Komponen;
warisanOnInit(e);
akhir;
procedure TWebForm1.Button1_Click(pengirim: System.Object; e: System.EventArgs);
var
Pesan: tali;
Obj: TObjek;
mulai
Obj := Server.CreateObject('ComProject.Test');
Tes(Obj).GetMsg(Pesan);
Label1.Teks := Pesan;
akhir;
akhir.
///Unit WebForm1.aspx:
<%@ Halaman bahasa="c#" Debug="benar" Codebehind="WebForm1.pas" AutoEventWireup="false" Inherits="WebForm1.TWebForm1" Aspcompat="benar"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transisi//EN">
<html>
<kepala>
<judul></judul>
<meta name="GENERATOR" content="Perpustakaan Paket Borland 7.1">
</kepala>
<tubuh ms_positioning="GridLayout">
<form runat="server">
<asp:tombol id=Tombol1
style="Z-INDEX: 1; KIRI: 238px; POSISI: absolut; ATAS: 158px"
runat="server" text="Tombol">
</asp:tombol>
<asp:label id=Label1
style="Z-INDEX: 2; KIRI: 190px; POSISI: absolut; ATAS: 54px"
runat="server">Label</asp:label>
</bentuk>
</tubuh>
</html>