ระบบของลูกค้าเป็นการผสมผสานระหว่าง C/S และ B/S เดิมทีส่วน B/S มีแผนจะใช้ IntraWeb
Delphi.net ปรากฏขึ้น ดังนั้นส่วน B/S จึงถูกเปลี่ยนเป็น Delphi.net
ปัญหาเกิดขึ้นระหว่างกระบวนการพัฒนา: Delphi 7 พัฒนาอัลกอริธึมการเข้ารหัส
เวลาแน่นเกินไปและเป็นไปไม่ได้ที่จะเขียนอัลกอริธึมการเข้ารหัสใหม่โดยใช้ Delphi.net ดังนั้นฉันจึงนึกถึง COM/COM+
น่าเสียดายที่มีข้อมูลน้อยมากบน Delphi.net และแม้แต่ข้อมูลเกี่ยวกับความสามารถในการทำงานร่วมกับ COM/COM+ ก็น้อยลงด้วยซ้ำ
ดังนั้นฉันจึงสำรวจด้วยตัวเองและได้สิ่งต่อไปนี้ (แนบซอร์สโค้ด):
1. สร้าง COM/COM+ ใน Delphi 7
(1) ใน IDE ไฟล์ -> ใหม่ -> อื่น ๆ -> ActiveX -> ActiveX Library
บันทึกไฟล์โครงการเป็น CompRoject;
(2) ใน IDE ไฟล์ -> ใหม่ -> อื่น ๆ -> ActiveX -> วัตถุ COM
กรอกแบบทดสอบลงในคอลัมน์ชื่อชั้นเรียนและบันทึกหน่วยการเรียนรู้เป็นแบบทดสอบ
(3) เพิ่มกระบวนการชื่อ GetMsg ไปยัง ITest ในมุมมอง -> พิมพ์ไลบรารีใน IDE
(4)Ctrl + F9;
(5) เรียกใช้ -> ลงทะเบียนเซิร์ฟเวอร์ ActiveX ใน IDE; // การลงทะเบียน COM/COM+ สามารถทำได้โดยใช้บรรทัดคำสั่ง
2. โทร COM/COM+ ใน Delphi.net
(1) ใน IDE ไฟล์ -> ใหม่ -> เว็บแอปพลิเคชัน asp.net
คุณอาจเจอปัญหามากมายที่ต้องจัดการกับตัวเอง!
(2) เพิ่มการอ้างอิงถึง COM/COM+:
ในโครงการ IDE -> เพิ่มการอ้างอิง -> การนำเข้า COM
เลือก ComProject ที่คุณเพิ่งลงทะเบียน และคลิกเพิ่มการอ้างอิงเพื่อเพิ่มการอ้างอิง
คลิกตกลง (ให้ความสนใจกับไฟล์โครงการของคุณ (ASP.NET Web Application)
เส้นทาง (Path) ไม่สามารถใช้ภาษาจีนได้);
(3) เพิ่ม ComProject เพื่อใช้ใน WebForm1;
(4) โทร COM/COM+
วางการควบคุมเว็บสองรายการไว้เหนือ WebForm1: ปุ่มและป้ายกำกับ
ดับเบิลคลิกที่ปุ่มและเขียนในกระบวนการ:
var
ข่าวสารเกี่ยวกับ: สตริง;
วัตถุ: TObject;
เริ่ม
Obj := Server.CreateObject('ComProject.Test'); // สร้าง COM/COM+
Test(Obj).GetMsg(Msg); // แปลง Obj เป็น Test และเรียกใช้เมธอด GetMsg
Label1.Text := ข่าวสารเกี่ยวกับ;
จบ;
(5) เพิ่ม Aspcompat="true" ไปที่บรรทัดเพจของ WebForm1.aspx
ตัวอย่างเช่น: <%@ ภาษาเพจ = "c#" Debug = "true" Codebehind = "WebForm1.pas" AutoEventWireup = "false" สืบทอด = "WebForm1.TWebForm1" Aspcompat = "true"%>
(6) Ctrl + F9, Run -> Run (หรือรันโดยไม่มีการดีบัก);
(7) คลิกปุ่มบนหน้าเว็บ เสร็จแล้วเหรอ?
//ต่อไปนี้เป็นส่วนซอร์สโค้ด:
ไฟล์โครงการ COM/COM+ (ComProject.dpr):
ไลบรารี ComProject;
การใช้งาน
คอมเซิร์ฟ,
ComProject_TLB ใน 'ComProject_TLB.pas'
ทดสอบใน 'Test.pas' {ทดสอบ: CoClass};
การส่งออก
DllGetClassObject,
DllCanUnloadตอนนี้
DllRegisterServer,
DllUnregisterServer;
{$อาร์ *.TLB}
{$อาร์ *.เรส}
เริ่ม
จบ.
//COM/COM+ หน่วยทดสอบ (Test.pas):
การทดสอบหน่วย
{$WARN SYMBOL_PLATFORM ปิด}
อินเตอร์เฟซ
การใช้งาน
Windows, ActiveX, คลาส, ComObj, ComProject_TLB, StdVcl;
พิมพ์
TTest = คลาส (TTypedComObject, ITest)
ได้รับการคุ้มครอง
ฟังก์ชั่น GetMsg (ออกข่าวสารเกี่ยวกับ: WideString): HResult;
{ประกาศวิธี ITest ที่นี่}
จบ;
การดำเนินการ
ใช้ ComServ;
ฟังก์ชัน TTest.GetMsg (ออกข่าวสารเกี่ยวกับ: WideString): HResult;
เริ่ม
Msg := 'ทดสอบ Com/Com+ สำเร็จ!';
จบ;
การเริ่มต้น
TTypedComObjectFactory.Create (ComServer, TTest, Class_Test,
ciMultiInstance, tmApartment);
จบ.
//COM/COM+ ประเภทไลบรารี t หน่วย (ComProject_TLB.pas):
หน่วย ComProject_TLB;
//************************************************ ********************** //
// คำเตือน
-
// ประเภทที่ประกาศในไฟล์นี้สร้างขึ้นจากข้อมูลที่อ่านจาก
// พิมพ์ Library หากไลบรารีประเภทนี้เป็นแบบชัดแจ้งหรือโดยอ้อม (ผ่าน
// ไลบรารีประเภทอื่นที่อ้างถึงไลบรารีประเภทนี้) นำเข้าใหม่หรือ
// คำสั่ง 'รีเฟรช' ของ Type Library Editor เปิดใช้งานขณะแก้ไข
// ประเภท Library เนื้อหาของไฟล์นี้จะถูกสร้างขึ้นใหม่ทั้งหมด
// การแก้ไขด้วยตนเองจะหายไป
//************************************************ ********************** //
// PASTLWTR: 1.2
// ไฟล์ที่สร้างเมื่อ 2004-2-6 13:28:46 จาก Type Library อธิบายไว้ด้านล่าง
//************************************************ ********************** //
// ประเภท Lib: D:/Program Files/Borland/Delphi7/Projects/comtest2/ComProject.tlb (1)
// LIBID: {92B46A1D-8A31-46C5-98FE-C03FEA98DC21}
//แอลซีดี: 0
// ไฟล์ช่วยเหลือ:
// HelpString: ไลบรารี ComProject
//DepndLst:
// (1) v2.0 stdole, (D:/WINDOWS/system32/stdole2.tlb)
//************************************************ ********************** //
{$TYPEDADDRESS OFF} // ต้องคอมไพล์หน่วยโดยไม่มีพอยน์เตอร์ตรวจสอบประเภท
{$WARN SYMBOL_PLATFORM ปิด}
{$เขียนได้CONST ON}
{$วาร์พรอพเซ็ทเตอร์ บน}
อินเตอร์เฟซ
ใช้ Windows, ActiveX, คลาส, กราฟิก, StdVCL, ตัวแปร;
//************************************************ *********************//
// GUIDS ที่ประกาศใน TypeLibrary ใช้คำนำหน้าต่อไปนี้:
// ประเภทไลบรารี: LIBID_xxxx
// CoClasses : CLASS_xxxx
// DISPอินเทอร์เฟซ : DIID_xxxx
// อินเทอร์เฟซที่ไม่ใช่ DISP: IID_xxxx
//************************************************ *********************//
ค่าคงที่
// TypeLibrary เวอร์ชันหลักและเวอร์ชันรอง
ComProjectMajorVersion = 1;
ComProjectMinorVersion = 0;
LIBID_ComProject: TGUID = '{92B46A1D-8A31-46C5-98FE-C03FEA98DC21}';
IID_ITest: TGUID = '{96CECA70-1438-4C54-982E-67C378F085E8}';
คลาส_ทดสอบ: TGUID = '{CA54722F-C5EF-4814-A8DB-C1C357832F08}';
พิมพ์
//************************************************ *********************//
// การประกาศไปข้างหน้าของประเภทที่กำหนดไว้ใน TypeLibrary
//************************************************ *********************//
ITest = อินเตอร์เฟส;
//************************************************ *********************//
// ประกาศของ CoClasses ที่กำหนดไว้ใน Type Library
// (หมายเหตุ: ที่นี่เราแมป CoClass แต่ละรายการกับอินเทอร์เฟซเริ่มต้น)
//************************************************ *********************//
ทดสอบ = ITest;
//************************************************ *********************//
// อินเทอร์เฟซ: ITest
// ตั้งค่าสถานะ: (256) OleAutomation
// GUID: {96CECA70-1438-4C54-982E-67C378F085E8}
//************************************************ *********************//
ITest = อินเตอร์เฟส (IUnknown)
['{96CECA70-1438-4C54-982E-67C378F085E8}']
ฟังก์ชั่น GetMsg (ออกข่าวสารเกี่ยวกับ: WideString): HResult;
จบ;
//************************************************ *********************//
// Class CoTest จัดให้มีเมธอด Create และ CreateRemote
// สร้างอินสแตนซ์ของอินเทอร์เฟซเริ่มต้นที่ ITest เปิดเผยโดย
// การทดสอบ CoClass ฟังก์ชั่นต่างๆ มีวัตถุประสงค์เพื่อใช้โดย
// ลูกค้าที่ต้องการทำให้ออบเจ็กต์ CoClass เปิดเผยโดย
// เซิร์ฟเวอร์ของไลบรารีประเภทนี้
//************************************************ *********************//
CoTest = คลาส
ฟังก์ชั่นคลาสสร้าง: ITest;
ฟังก์ชันคลาส CreateRemote (const MachineName: string): ITest;
จบ;
การดำเนินการ
ใช้ComObj;
ฟังก์ชันคลาส CoTest.Create: ITest;
เริ่ม
ผลลัพธ์ := CreateComObject(CLASS_Test) เป็น ITest;
จบ;
ฟังก์ชันคลาส CoTest.CreateRemote (const MachineName: string): ITest;
เริ่ม
ผลลัพธ์ := CreateRemoteComObject(MachineName, CLASS_Test) เป็น ITest;
จบ;
จบ.
/////////////////////////////////////// ต่อไปนี้เป็นซอร์สโค้ดสำหรับการเรียก COM/COM+ จาก Delphi.net/// ////////////////////////////
//หน่วย WebForm1.pas:
หน่วย WebForm1;
อินเตอร์เฟซ
การใช้งาน
System.Collections, System.ComponentModel,
System.Data, System. Drawing, System.Web, System.Web.sessionState,
System.Web.UI, System.Web.UI.WebControls, System.Web.UI.HtmlControls,
คอมโปรเจ็กต์;
พิมพ์
TWebForm1 = คลาส (System.Web.UI.Page)
{$REGION 'โค้ดที่นักออกแบบจัดการ'}
ส่วนตัวที่เข้มงวด
ขั้นตอนInitializeComponent;
ขั้นตอน Button1_Click (ผู้ส่ง: System.Object; e: System.EventArgs);
{$ENDREGION}
ส่วนตัวที่เข้มงวด
ขั้นตอน Page_Load (ผู้ส่ง: System.Object; e: System.EventArgs);
ได้รับการคุ้มครองอย่างเข้มงวด
Button1: System.Web.UI.WebControls.Button;
Label1: System.Web.UI.WebControls.Label;
ขั้นตอน OnInit (e: EventArgs);
ส่วนตัว
{คำประกาศส่วนตัว}
สาธารณะ
{คำประกาศสาธารณะ}
จบ;
การดำเนินการ
{$REGION 'โค้ดที่ออกแบบโดยนักออกแบบ'}
/// <สรุป>
/// วิธีการที่จำเป็นสำหรับการสนับสนุน Designer -- ห้ามแก้ไข
/// เนื้อหาของวิธีนี้ด้วยโปรแกรมแก้ไขโค้ด
/// </สรุป>
ขั้นตอน TWebForm1.InitializeComponent;
เริ่ม
รวม (Self.Button1.Click, Self.Button1_Click);
รวม (Self.Load, Self.Page_Load);
จบ;
{$ENDREGION}
ขั้นตอน TWebForm1.Page_Load (ผู้ส่ง: System.Object; e: System.EventArgs);
เริ่ม
// สิ่งที่ต้องทำ: ใส่โค้ดผู้ใช้เพื่อเริ่มต้นเพจที่นี่
จบ;
ขั้นตอน TWebForm1.OnInit (e: EventArgs);
เริ่ม
-
// จำเป็นสำหรับการสนับสนุนนักออกแบบ
-
เริ่มต้นส่วนประกอบ;
สืบทอด OnInit (e);
จบ;
ขั้นตอน TWebForm1.Button1_Click (ผู้ส่ง: System.Object; e: System.EventArgs);
var
ข่าวสารเกี่ยวกับ: สตริง;
วัตถุ: TObject;
เริ่ม
Obj := Server.CreateObject('ComProject.Test');
ทดสอบ(Obj).GetMsg(ข่าวสารเกี่ยวกับ);
Label1.Text := ข่าวสารเกี่ยวกับ;
จบ;
จบ.
///หน่วย WebForm1.aspx:
<%@ ภาษาหน้า = "c #" Debug = "true" Codebehind = "WebForm1.pas" AutoEventWireup = "false" สืบทอด = "WebForm1.TWebForm1" Aspcompat = "true"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<หัว>
<title></title>
<meta name="GENERATOR" content="บอร์แลนด์แพ็คเกจไลบรารี 7.1">
</หัว>
<body ms_positioning="GridLayout">
<ฟอร์ม runat="เซิร์ฟเวอร์">
<asp:ปุ่ม id=Button1
style="Z-INDEX: 1; ซ้าย: 238px; ตำแหน่ง: สัมบูรณ์; บน: 158px"
runat = "เซิร์ฟเวอร์" ข้อความ = "ปุ่ม">
</asp:ปุ่ม>
<asp:label id=Label1
style="Z-INDEX: 2; ซ้าย: 190px; ตำแหน่ง: สัมบูรณ์; บน: 54px"
runat="server">ป้ายกำกับ</asp:label>
</แบบฟอร์ม>
</ร่างกาย>
</html>