نظام العميل عبارة عن مزيج من C/S وB/S وقد تم التخطيط للجزء B/S في الأصل لاستخدام IntraWeb.
حدث ظهور Delphi.net، لذلك تم تحويل الجزء B/S إلى Delphi.net؛
نشأت مشكلة أثناء عملية التطوير: تم تطوير خوارزمية التشفير بواسطة دلفي 7.
كان الوقت ضيقًا جدًا وكان من المستحيل إعادة كتابة خوارزمية التشفير باستخدام Delphi.net، لذلك فكرت في COM/COM+،
من المؤسف أن هناك القليل جدًا من المعلومات حول Delphi.net، وحتى معلومات أقل حول إمكانية التشغيل البيني مع COM/COM+.
لذلك استكشفت الأمر بنفسي وتوصلت إلى ما يلي (مرفق كود المصدر):
1. قم بإنشاء COM/COM+ في دلفي 7
(1) في IDE، ملف -> جديد -> أخرى -> ActiveX -> مكتبة ActiveX،
احفظ ملف المشروع باسم CompRoject؛
(2) في IDE، ملف -> جديد -> آخر -> ActiveX -> كائن COM،
املأ الاختبار في عمود اسم الفصل واحفظ الوحدة كاختبار؛
(3) أضف عملية تسمى GetMsg إلى ITest في العرض -> اكتب Library في IDE؛
(4)السيطرة + F9؛
(5) تشغيل -> تسجيل خادم ActiveX في IDE؛ // يمكن أيضًا تسجيل COM/COM+ باستخدام سطر الأوامر
2. اتصل بـ COM/COM+ في Delphi.net
(1) في IDE، ملف -> جديد -> تطبيق ويب asp.net،
قد تواجهك الكثير من المشاكل التي عليك أن تتعامل معها بنفسك!
(2) أضف مرجعًا إلى COM/COM+:
في مشروع IDE ->إضافة مرجع -> واردات COM،
حدد ComProject الذي قمت بتسجيله للتو وانقر فوق "إضافة مرجع" لإضافة مرجع.
انقر فوق "موافق" (انتبه إلى ملف المشروع الخاص بك (تطبيق ويب ASP.NET)
لا يمكن للمسار (المسار) استخدام اللغة الصينية)؛
(3) إضافة ComProject إلى الاستخدامات في WebForm1؛
(4) اتصل بـ COM/COM+
ضع عنصري تحكم ويب فوق WebForm1: زر وتسمية؛
انقر نقرًا مزدوجًا فوق الزر واكتب في هذه العملية:
فار
الرسالة: سلسلة؛
Obj: TObject;
يبدأ
Obj := Server.CreateObject('ComProject.Test'); // إنشاء COM/COM+
Test(Obj).GetMsg(Msg); // تحويل Obj إلى اختبار واستدعاء طريقة GetMsg؛
Label1.Text := Msg;
نهاية؛
(5) أضف Aspcompat = "true" إلى سطر الصفحة الخاص بـ WebForm1.aspx،
على سبيل المثال: <%@ لغة الصفحة = "c#" Debug = "true" Codebehind = "WebForm1.pas" AutoEventWireup = "false" Inherits = "WebForm1.TWebForm1" Aspcompat = "true"٪>
(6)Ctrl + F9، تشغيل -> تشغيل (أو تشغيل بدون تصحيح الأخطاء)؛
(7) انقر فوق الزر الموجود على صفحة الويب، هل تم ذلك؟
// فيما يلي جزء التعليمات البرمجية المصدر:
ملف مشروع COM/COM+ (ComProject.dpr):
مكتبة كومبروجكت؛
الاستخدامات
كوم سيرف,
ComProject_TLB في 'ComProject_TLB.pas'،
اختبار في "Test.pas" {اختبار: CoClass}؛
صادرات
دللجيتكلاسوبجيكت،
دلكان أنلود ناو،
دللريجسترسيرفر,
DllUnregisterServer;
{$R *.TLB}
{$R *.RES}
يبدأ
نهاية.
//وحدة اختبار COM/COM+ (Test.pas):
اختبار الوحدة؛
{$تحذير SYMBOL_PLATFORM OFF}
واجهة
الاستخدامات
ويندوز، ActiveX، فئات، ComObj، ComProject_TLB، StdVcl؛
يكتب
TTest = فئة (TTypedComObject، ITest)
محمي
دالة GetMsg(out Msg: WideString): HResult;
{أعلن عن طرق ITest هنا}
نهاية؛
تطبيق
يستخدم كوم سيرف؛
وظيفة TTest.GetMsg (خارج الرسالة: WideString): HResult؛
يبدأ
Msg := 'تم اختبار Com/Com+ بنجاح!';
نهاية؛
التهيئة
TTypedComObjectFactory.Create(ComServer، TTest، Class_Test،
ciMultiInstance, tmApartment);
نهاية.
//وحدة مكتبة النوع COM/COM+ (ComProject_TLB.pas):
وحدة ComProject_TLB؛
//********************************************************************************************************************************************************************************* ********************* //
// تحذير
// -------
// تم إنشاء الأنواع المعلنة في هذا الملف من البيانات المقروءة من a
// اكتب Library.إذا كانت مكتبة النوع هذه بشكل صريح أو غير مباشر (عبر
// مكتبة نوع أخرى تشير إلى مكتبة النوع هذه) تم إعادة استيرادها، أو
// تم تنشيط أمر "التحديث" لمحرر مكتبة النوع أثناء تحرير ملف
// اكتب المكتبة، سيتم إعادة إنشاء محتويات هذا الملف وكل شيء
// سيتم فقدان التعديلات اليدوية.
//*************************************************** ********************* //
// باستلوتر: 1.2
// الملف الذي تم إنشاؤه بتاريخ 6-2-2004 13:28:46 من مكتبة النوع الموضحة أدناه.
//*************************************************** ********************* //
// النوع Lib: D:/Program Files/Borland/Delphi7/Projects/comtest2/ComProject.tlb (1)
// ليبيد: {92B46A1D-8A31-46C5-98FE-C03FEA98DC21}
//LCID: 0
// ملف المساعدة:
// سلسلة التعليمات: مكتبة ComProject
//ديبندلست:
// (1) v2.0 stdole، (D:/WINDOWS/system32/stdole2.tlb)
//********************************************************************************************************************************************************************************* ********************* //
{$TYPEDADDRESS OFF} // يجب تجميع الوحدة بدون مؤشرات محددة النوع.
{$تحذير SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
واجهة
يستخدم Windows، ActiveX، Classes، Graphics، StdVCL، Variants؛
//********************************************************************************************************************************************************************************* *********************//
// يتم استخدام 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}';
CLASS_Test: TGUID = '{CA54722F-C5EF-4814-A8DB-C1C357832F08}';
يكتب
//*************************************************** *********************//
// إعادة توجيه الإعلان عن الأنواع المحددة في TypeLibrary
//********************************************************************************************************************************************************************************* *********************//
ITest = الواجهة;
//*************************************************** *********************//
// إعلان CoClasses المحدد في مكتبة النوع
// (ملاحظة: هنا نقوم بتعيين كل CoClass إلى الواجهة الافتراضية الخاصة به)
//********************************************************************************************************************************************************************************* *********************//
اختبار = ITest؛
//********************************************************************************************************************************************************************************* *********************//
// الواجهة: ITest
// الأعلام: (256) OleAutomation
// المعرف الفريد العمومي: {96CECA70-1438-4C54-982E-67C378F085E8}
//********************************************************************************************************************************************************************************* *********************//
ITest = الواجهة (IUnknown)
['{96CECA70-1438-4C54-982E-67C378F085E8}']
دالة GetMsg(out Msg: WideString): HResult;
نهاية؛
//****************************************************************************************************************************************************************************** *********************//
// يوفر Class CoTest طريقة إنشاء وCreateRemote
// إنشاء مثيلات للواجهة الافتراضية التي كشف عنها ITest
// اختبار CoClass المخصص للاستخدام من قبل
// العملاء الذين يرغبون في أتمتة كائنات CoClass التي تم الكشف عنها بواسطة
// خادم مكتبة الكتابة هذه.
//****************************************************************************************************************************************************************************** *********************//
CoTest = class
إنشاء وظيفة الفصل: ITest؛
وظيفة الفئة CreateRemote(const MachineName: string): ITest;
نهاية؛
تطبيق
this.usesComObj;
وظيفة الفئة CoTest.Create: ITest؛
يبدأ
النتيجة: = CreateComObject(CLASS_Test) كـ ITest؛
نهاية؛
وظيفة الفئة CoTest.CreateRemote(const MachineName: string): ITest;
يبدأ
النتيجة: = CreateRemoteComObject(MachineName, CLASS_Test) as ITest;
نهاية؛
نهاية.
//////////////////////////////// فيما يلي الكود المصدري للاتصال بـ COM/COM+ من دلفي.نت/// ///////////////////////
//وحدة 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،
comProject;
يكتب
TWebForm1 = فئة (System.Web.UI.Page)
{$REGION "الرمز المُدار بواسطة المصمم"}
خاصة صارمة
الإجراءInitializeComponent;
الإجراء Button1_Click(sender: System.Object; e: System.EventArgs);
{$ENDREGION}
خاصة صارمة
الإجراء Page_Load(sender: System.Object; e: System.EventArgs);
محمية بشكل صارم
Button1: System.Web.UI.WebControls.Button؛
التسمية 1: System.Web.UI.WebControls.Label؛
الإجراء OnInit(e: EventArgs);
خاص
{الإقرارات الخاصة}
عام
{التصريحات العامة}
نهاية؛
تطبيق
{$REGION "الرمز المُدار بواسطة المصمم"}
/// <الملخص>
/// الطريقة المطلوبة لدعم المصمم - لا تقم بتعديلها
/// محتويات هذه الطريقة مع محرر الكود.
/// </الملخص>
الإجراء TWebForm1.InitializeComponent؛
يبدأ
تضمين(Self.Button1.Click, Self.Button1_Click);
تضمين(Self.Load, Self.Page_Load);
نهاية؛
{$ENDREGION}
الإجراء TWebForm1.Page_Load(sender: System.Object; e: System.EventArgs);
يبدأ
// TODO: ضع رمز المستخدم لتهيئة الصفحة هنا
نهاية؛
الإجراء TWebForm1.OnInit(e: EventArgs);
يبدأ
//
// مطلوب لدعم المصمم
//
this.InitializeComponent;
inheritedOnInit(e);
نهاية؛
الإجراء TWebForm1.Button1_Click(sender: System.Object; e: System.EventArgs);
فار
الرسالة: سلسلة؛
Obj: TObject;
يبدأ
Obj := Server.CreateObject('ComProject.Test');
اختبار(Obj).GetMsg(Msg);
Label1.Text := Msg;
نهاية؛
نهاية.
/// وحدة WebForm1.aspx:
<%@ لغة الصفحة = "c#" Debug = "true" Codebehind = "WebForm1.pas" AutoEventWireup = "false" Inherits = "WebForm1.TWebForm1" Aspcompat = "true"٪>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<أتش تي أم أل>
<الرأس>
<العنوان></العنوان>
<meta name="GENERATOR" content="Borland Package Library 7.1">
</الرأس>
<body ms_positioning="GridLayout">
<نموذج تشغيل = "الخادم">
<asp:معرف الزر=Button1
النمط = "Z-INDEX: 1؛ اليسار: 238 بكسل؛ الموضع: مطلق؛ الأعلى: 158 بكسل"
تشغيل = "الخادم" نص = "زر">
</asp:زر>
<asp:معرف التسمية=Label1
النمط = "مؤشر Z: 2؛ اليسار: 190 بكسل؛ الموضع: مطلق؛ الأعلى: 54 بكسل"
runat="server">التسمية</asp:label>
</النموذج>
</الجسم>
</html>