نماذج من دعم مكونات COM في سيلفرلايت 4

This article is available in English too, check it out here.

اقرأ: مقدمة إلى دعم مكونات COM في سيلفرلايت 4

المشروع الأول: قارئ الكلمات TalkingAppsمشاهدة المشروعتحميل المشروع
المشروع الثاني: مسجل المدونات FeaturedBlogsمشاهدة المشروعتحميل المشروع
المشروع الثالث: مستعرض الملفات FileSurferمشاهدة المشروعتحميل المشروع

المحتويات

محتويات هذا الموضوع:

  • المحتويات
  • مقدمة
  • المفاهيم
    • الوصول إلى مكونات COM
    • إنشاء عناصر COM والتعامل معها
    • الربط المتأخر Late Binding
  • تجهيز مشروك
  • خصائص مشروعات OOB
  • النموذج الأول: قراءة الكلمات
  • النموذج الثاني: برمجة الأوفيس
    • برمجة الوورد
    • برمجة الأوتلوك
    • برمجة الإكسيل
  • النموذج الثالث: التحكم في نظام الملفات
  • خاتمة

 

مقدمة

كنا قد تكلمنا في الدرس السابق عن دعم مكونات COM في سيلفرلايت 4، وتكلمنا على أن واحدة من أهم معالم الإصدار الرابع من سيلفرلايت هي دعمه لمكونات COM والتعامل معها برمجيا من خلال الكود، ويتم هذا بشرطين أساسيين وهما أن يعمل التطبيق خارج المتصفح OOB، وأن يحصل على التطبيق على الثقة الأعلى Elevated Trust (وهذا بالطبع لأن مكونات COM تستطيع التحكم بشكل كامل في نظام التشغيل.) واليوم، نذكر بإذن الله تعالى بعضا من النماذج والأمثلة على دعم مكونات COM في سيلفرلايت 4 ونبدأها بشرح المفاهيم الأساسية وكيفية تجهيز مشروع السيلفرلايت ليعمل مع مكونات COM.

 

المفاهيم الأساسية

الوصول إلى مكونات COM

كيف يستطيع برنامجك الوصول إلى مكونات COM؟ الحل في ريجيستري Registry النظام!

تقوم مكونات COM بتوفير خدماتها عن طريق تسجيل نفسها في الريجستري في HKCR\CLSID برمز معرف عالمي GUID (أو Globally Unique Identifier) وهو رمز يتكون من 32 حرف ويكون بالصيغة {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} ويهدف إلى تمييز المكونات بعضها عن بعض. ولأن هذا المعرف يكون من الصعب للغاية حفظه وتذكره فإن مكونات COM تقوم بتعريف نفسها مرة أخرى بمعرف آخر ويسمى المعرف البرمجي ProgID (أو Programmatic Identifier) ويكون هذا المعرف بسيط جدا بحيث يمكن حفظه وتذكره، فالمعرف البرمجي مثلا لمكون COM الخاص ببرمجة الوورد يسمى Word.Application.

هل يهمنا كل هذا؟ بالطبع لا، هذا للعلم فقط! ما يهمنا هو معرفة أن كل مكون COM له معرف برمجي ProgID خاص به تستطيع من خلاله من خلال الكود الوصول إلى المكون واستخدام الأوامر الخاصة به، هذا فقط ما يهمنا معرفته. وهذا المعرف البرمجي تستطيع الحصول عليه من خلال الويب أو من خلال الشرح Documentation الموجود مع هذه المكونات. فمثلا، أثناء قراءتك لواجهة التحدث البرمجية Speech API تعلم أن واحدة من أهم المكونات المستخدم في عملية قراءة الكلمات Text-to-Speech هي المكتبة sapi.dll والتي يمكنك الاستفادة من خدماتها باستخدام المعرف SAPI.SpVoice، وكذلك الدوال التي تقدمها هذه الخدمة تستطيع معرفتها أيضا من خلال شرح هذا المكون.

إنشاء عناصر COM والتعامل معها

بعد تحديدك للمكون الذي تريد التعامل معه تبدأ أول خطوة وهي إنشاء عنصر من هذا المكون كي تستطيع التواصل معه. تتم عملية إنشاء هذا العنصر عن طريق الكلاس AutomationFactory والموجود في النطاق System.Runtime.InteropServices.Automation. فعن طريق الدالة CreateObject() (والتي تأخذ مدخلا واحدا وهو المعرف البرمجي ProgID) تقوم بإنشاء هذا العنصر.

يدعم هذا الكلاس أيضا خاصية هامة جدا وهي IsAvailable والتي تحدد ما إذا كان نظام التشغيل يدعم COM (إذا كان نظام ويندوز) أم لا. فيجب عليك دوما قبل تنفيذ الأكواد التأكد من دعم نظام تشغيل المستخدم لمكونات COM لتفادي فشل التطبيق.

الربط المتأخر Late Binding

عند إسنادك كائن إلى متغير معين يحدث الربط بين هذا الكائن وهذا المتغير، وهذا الربط إما مبكر وإما متأخر.

الربط المبكر Early Binding: وهو ذا ما تفعله دوما مع العناصر، تقوم بإسناد عنصر إلى متغير معين وتقوم بالنداء على دوال هذا المتغير واستخدام التكملة التلقائية Intellisense، وعند وقوفك بالمؤشر على هذا العنصر حصل على بياناته، وعند إسنادك قيمة خاطئة (مثلا قيمة نصية String تسندها إلى عنصر رقمي Integer) يحدث خطأ ولا يمكنك تنفيذ البرنامج قبل تلافي الأخطاء، وإذا أخطأت بكتابة اسم دالة داخل العنصر وحاولت النداء عليها يحدث خطأ أيضا ولا يمكنك الاستكمال قبل كتابة اسم الدالة بالشكب الصحيح.

الربط المتأخر Late Binding: وهو النوع الآخر من الربط ويحدث أثناء وقت التشغيل Runtime، وبالتالي فلا تحصل على تكملة تلقائية Intellisense أثناء كتابتك الأكواد، ولا تستطيع معرفة نوع العنصر الذي تستخدمه، وأيضا عند إسنادك لقيمة خاطئة أو كتابتك لاسم دالة غير موجودة مثلا لا تشعر بأن هذه الدالة غير موجودة ولا ترسل إليك الأخطاء إلا أثناء تشغيلك البرنامج. ورغم ذلك كله فالربط المتأخر له عدة فوائد من أهمها أنك لا تحتاج إضافة المكونات الخارجية إلى مشروعك إذ أن الربط يحدث أثناء وقت التشغيل وليس قبل ذلك، وبالتالي يقل حجم البرنامج. ودائما ما تحتاج أكواد الربط المتأخر إما كتابتها في بيئة أخرى تدعم الربط المبكر أو أن يقوم بكتابتها المتمرسين جدا في كتابة الأكواد ولديهم خبرة كافية بها.

إذا فالربط المبكر هو ما تستخدمه دوما وربما لم تستخدم غيره قبل ذلك. وهنا السؤال: هل للربط المتأخر علاقة بسيلفرلايت؟ ثم، هل لمكونات COM علاقة بهذا الموضوع؟

قدم الربط المتأخر كواحد من خصائص ومزايا الإصدار الرابع من سيلفرلايت، ويساعدك على شيئين، أولهما أنه يوفر لك طريقة سهلة وبسيطة للتعامل مع محتويات صفحة الويب الموجود فيها تطبيقك (بالنسبة لتطبيقات سيلفرلايت للويب) حيث أنك بالتأكيد لن تعرف محتويات هذه الصفحة إلا أثناء وقت التشغيل.

الثانية وهي ما تهمنا هنا أن الربط المتأخر يساعدك في عملية الربط بين مشروعك ومكونات COM فهو يخفض من حجم تطبيقك حيث أنك لا تحتاج إلى إضافة المكون نفسه إلى المشروع لتشغيل الربط المبكر، وأيضا فهو يقلل من نسبة وقوعك في مشكلة جحيم المكتبات DLL Hell وهو الغالب حدوثه إذا كان لنفس المكتبة أكثر من إصدار فبالتالي يوفر الحماية اللازمة والبعد عن فشل التطبيق.

وتتم عملية الربط المتأخر عن طريق الكلمة الدليلية dynamic والتي ستستخدمها دائما لإسناد الناتج من دالة AutomationFactory.CreateObject() وأيضا الناتج من الدوال الداخلية لهذا المكون.

لاحظ أن الربط المتأخر يحتاج إلى إضافة المكتبة Microsoft.CSharp.dll إلى مراجع المشروع.

والآن لنعطي نظرة على الأمثلة والنماذج على دعم مكونات COM في سيلفرلايت. ولكن قبل ذلك نقوم بتجهيز المشروع للعمل.

 

تجهيز المشروع

كما قلنا فكي يعمل مشروع سيلفرلايت 4 (أو إصدارات أعلى وليست سابقة) مع مكونات COM يحتاج إلى أن يعمل خارج المتصفح OOB (أو Out-of-Browser) وأن يحصل على الثقة الأعلى Elevated Trust. لتجهيز مشروك اتبع الخطوات التالية:

أولا، قم بإنشاء مشروع تطبيق سيلفرلايت Silverlight Application. في شاشة خيارات المشروع التي ستظهر لك (شكل 1) قم بتحديد الإصدار الرابع من سيلفرلايت، وقم أيضا بإلغاء خيار إنشاء مشروع ويب (وذلك لأن مشروعنا يجب أن يعمل خارج المتصفح فلا يحتاج إلى مشروع ويب.)

شكل 1 - إنشاء مشروع سيلفرلايت جديد

شكل 1 - إنشاء مشروع سيلفرلايت جديد

الآن، ادخل على خصائص المشروع Project Properties ثم اختر التبويب الأول Silverlight، ثم من خصائص إنشاء المشروع من أسفل الشاشة قم بتحديد أن المشروع يعمل كـ OOB باستخدام خيار “Enabling running application out of browser” (انظر شكل 2.)

شكل 2 - إعداد تطبيق سيلفرلايت ليعمل على سطح المكتب OOB

شكل 2 - إعداد تطبيق سيلفرلايت ليعمل على سطح المكتب OOB

أخيرا، لتحديد أن المشروع يتطلب الثقة الأعلى اضغط على زر “Out-of-Browser Settings” للدخول على شاشة إعدادات تطبيقات سطح المكتب ومن خلال هذه الشاشة من أسفلها فعل الخيار “Require elevated trust when running outside the browser” (انظر شكل 3.)

شكل 3 - إعطاء الثقة الأعلى لتطبيق سيلفرلايت

شكل 3 - إعطاء الثقة الأعلى لتطبيق سيلفرلايت

الآن اضغط OK ثم اغلق شاشة خصائص المشروع بعد حفظها.

الآن، لتفعيل الربط المتأخر والكود الديناميكي قم بإضافة المكتبة Microsoft.CSharp.dll إلى مراجع المشروع بالضغط بزر الفأرة الأيمن على المشروع واختيار Add Reference (شكل 4.)

شكل 4 - إضافة مرجع مكتبة Microsoft.CSharp.dll

شكل 4 - إضافة مرجع مكتبة Microsoft.CSharp.dll

 

خصائص مشروعات OOB

لاحظ أن تطبيقات OOB يمكنها العمل في المتصفح أيضا كما يمكنها العمل على سطح المكتب، فيمكنك ببساطة ضغط F5 لتشغيل التطبيق كـ OOB (شكل 5.)

شكل 5 - تطبيق سيلفرلايت لسطح المكتب OOB

شكل 5 - تطبيق سيلفرلايت لسطح المكتب OOB

كما يمكنك أيضا تشغيل التطبيق كتطبيق ويب عن طريق إضافة مشروع ويب وربط سيلفرلايت بهذا المشروع أو على الأقل الذهاب إلى مجلد المشروع والدخول إلى Bin\Debug وتشغيل صفحة الويب التجريبية TestPage.html (شكل 6.)

شكل 6 - تشغيل مشروع OOB في الويب

شكل 6 - تشغيل مشروع OOB في الويب

وعند تشغيل تطبيق سطح المكتب على الويب يمكنك الضغط بزر الفأرة الأيمن على الشاشة واختيار أمر التنصيب لتحميل البرنامج على نظام التشغيل (شكل 7.)

شكل 7 - تنصيب مشروع سيلفرلايت على الجهاز

شكل 7 - تنصيب مشروع سيلفرلايت على الجهاز

وحينها يتم تنصيب التطبيق مباشرة، أو تظهر لك نافذة تأمينية تطلب منك الموافقة على تنصيب البرنامج إذا كان هذا البرنامج يتطلب ثقة أعلى Elevated Trust (شكل 8.)

شكل 8 - الموافقة على تنصيب تطبيق يتطلب ثقة أعلى

شكل 8 - الموافقة على تنصيب تطبيق يتطلب ثقة أعلى

لاحظ أيضا أنه عند تشغيلك مشروع OOB كمشروع ويب لا يحصل حينها على صلاحيات مشاريع الـ OOB ولا يحصل على ثقة أعلى وبالتالي لا تستطيع وقتها التعامل مع مكونات COM. وهنا تأتي واحدة من مهام عنصر التطبيق System.Windows.Application والذي يوفر لك الخاصية IsRunningOutOfBrowser للتأكد من أن البرنامج يعمل كـ OOB.

والآن، لننتقل إلى التكويد.

 

النموذج الأول: قراءة الكلمات

في هذا النموذج نقوم باستخدام المكون sapi.dll والذي يوفر لنا خدمة قراءة الكلمات والنصوص. هذا المكون يمكن الوصول إليه عن طريق المعرف البرمجي SAPI.SpVoice ويحوي عدة أوامر يهمنا منها الأمر ()Speak والذي يقوم بقراءة الكلمات.

لتنفيذ هذا التطبيق أولا قم بإنشاء مشروع سيلفرلايت جديد بالخيارات المذكورة سابقا، ثم قم بتصميم الشاشة باستخدام الأكواد التالية:

<Grid Background="White">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <TextBlock Grid.Row="0" Margin="10" Text="Enter the text to read:" />
    <TextBox Grid.Row="1" Margin="10" x:Name="inputTextBox" />
    <Button Grid.Row="2" Margin="10" Width="150" Click="Button_Click" Content="Read" />
</Grid>

لتصبح كالشكل التالي (شكل 9):

شكل 9 - تطبيق قراءة الكلمات

شكل 9 - تطبيق قراءة الكلمات

الآن، نقوم بتكويد زر الأمر ليقوم بتنفيذ عملية القراءة:

تأكد من إضافة جملة using للنطاق System.Runtime.InteropServices.Automation إلى صفحة الكود أولا.

private void Button_Click(object sender, RoutedEventArgs e)
{
    if (!Application.Current.IsRunningOutOfBrowser)
    {
        MessageBox.Show("This application cannot be run from the browser.");
        return;
    }
    if (!AutomationFactory.IsAvailable)
    {
        MessageBox.Show("Your operating system does not support COM.");
        return;
    }
    try
    {
        using (dynamic obj = AutomationFactory.CreateObject("SAPI.SpVoice"))
        {
            obj.Speak(inputTextBox.Text);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("An error has occurred.\n" + ex.Message);
    }
}

في الكود السابق تأكدنا أولا من أن التطبيق يعمل من نظام التشغيل وليس المتصفح، ومنعنا استكمال تنفيذ الكود في حالة كون البرنامج يعمل من المتصفح (تتذكر متطلبات تشغيل COM في سيلفرلايت؟.) ثم بعد ذلك وباستخدام الخاصية AutomationFactory.IsAvailable تأكدنا من أن المستخدم يعمل على نظام تشغيل ويندوز وليس نظام آخر لا يدعم COM. بعد ذلك قمنا بإنشاء العنصر المطلوب باستخدام الأمر AutomationFactory.CreateObject() وقمنا بإعطائه المعرف البرمجي المطلوب وتأكدنا من إسناده إلى متغير ديناميكي dynamic لإتمام عملية الربط المتأخر. أخيرا، قمنا بالنداء على الدالة وتنفيذ العملية. لاحظ أن مكونات COM تستهلك الكثير من موارد الجهاز لذلك تحتاج إلى وضع عنصر المكون داخل جملة using كما في المثال السابق.

بسيط، أليس كذلك؟

وهذا هو المشروع الكامل ببعض التعديلات الهامة:

مشاهدة المشروعالتحميل

 

النموذج الثاني: التعامل مع الأوفيس

لن نخوض أبدا في شرح الواجهة البرمجية للأوفيس ولا حتى لواحدة من تطبيقاته حيث أن موضوع النقاش لا يسمح بهذا، وأيضا فالواجهة البرمجية لواحدة فقط من تطبيقات الأوفيس تحتاج إلى العديد والعديد من المواضيع لشرحها ولا يتسع لنا المجال لذلك. ولكن يمكننا إعطاء نبذة بسيطة ومثال بسيط كمدخل إلى برمجة الأوفيس وهذا ما سنفعله الآن.

برمجة الوورد

يمكنك الوصول إلى مكون COM الخاص ببرمجة الوورد باستخدام المعرف البرمجي Word.Application. يوفر لك هذا المكون واجهة برمجية سهلة تمكنك من التعامل مع الوورد بشكل كامل برمجيا، فتستطيع مثلا إنشاء مستندات جديدة أو فتح مستندات موجودة مسبقا على الجهاز والتعديل عليها، كما يمكنك أيضا تطبيق تنسيق كامل على جميع الصفحة، وأيضا طباعة وحفظ المستند، وما إلى غير ذلك حتى تصل إلى عمليات مثل تشغيل الماكرو Macro وتطبيق القوالب Templates.

وكمثال بسيط، الكود التالي يقوم بفتح برنامج الوورد وكتابة كلمات بسيطة في الصفحة:

using (dynamic app = AutomationFactory.CreateObject("Word.Application"))
{
    dynamic doc = word.Documents.Add();
    dynamic par = document.Content.Paragraphs.Add();
    par.Range.Text = "Hello, World!";
    par.Range.Font.Bold = true;
    word.Visible = true;
}

لمعرفة المزيد عن واجهة برمجة الوورد انظر هذا الموضوع: http://msdn.microsoft.com/en-us/library/kw65a0we.aspx.

برمجة الأوتلوك

تمام مثل الوورد، برمجة الأوتلوك Outlook تعتمد أيضا على مكون COM، وهذا المكون له المعرف البرمجي Outlook.Application. والمثال التالي يوضح كيفية إرسال بريد إلكتروني في سيلفرلايت باستخدام الأوتلوك:

using (dynamic app = AutomationFactory.CreateObject("Outlook.Application"))
{
    dynamic mail = app.CreateItem(0);
    mail.Recipients.Add("");
    mail.Subject = "Hello, World!";
    mail.Body = "Silverlight COM Automation is so cool ;)";
    mail.Save();
    mail.Send();
}

لشرح كامل للواجهة البرمجية للأوتلوك: http://msdn.microsoft.com/en-us/library/ms268893.aspx.

برمجة الإكسيل

والإكسيل أيضا يوفر لك مكون لبرمجته وهو Excel.Application وهذا تطبيق كامل بالسيلفرلايت يوضح لك الفكرة، وهو عبارة عن تطبيق يقوم بتصدير بيانات موجودة في DataGrid بصيغة الإكسيل. شكل 10 يوضح صورة التطبيق.

شكل 10 - تطبيق الإكسيل في سيلفرلايت

شكل 10 - تطبيق الإكسيل في سيلفرلايت

مشاهدة المشروعالتحميل

لشرح كامل للواجهة البرمجية للإكسيل: http://msdn.microsoft.com/en-us/library/wss56bz7.aspx.

 

النموذج الثالث: التحكم في نظام الملفات

ربما واحدة من العوائق التي تواجهك أثناء تعاملك مع سيلفرلايت هي أنك ليس لديك الصلاحيات للوصول الكامل إلى ملفات نظام التشغيل. تتذكر حين قلنا بأن دعم COM يعطي تطبيقك قوة ليس لها حدود؟ بالفعل هذا صحيح، فمع المكون Scripting.FileSystemObject تستطيع التحكم الكامل والوصول إلى كافة الملفات على النظام، وهذا ما يوضحه المثال التالي:

using (dynamic fso = AutomationFactory.CreateObject("Scripting.FileSystemObject"))
{
    string path = "C:\\file.txt";
    dynamic file = fso.CreateTextFile(filePath, true);
    file.WriteLine("Hello, World!");
    file.Close();
    file = fso.OpenTextFile(filePath, 1, true);
    file.Close();
}

في المثال السابق يقوم الكود بإنشاء الملف C:\file.txt وكتابة بعض الكلمات فيه. ونلاحظ أنه بدون دعم COM لن تستطيع أبدا كتابة مثل هذا الملف في القرص C.

أما هذا فهو تطبيق بسيط يقوم باستعراض الملفات الموجودة على نظام التشغيل:

شكل 11 - تطبيق مستعرض الملفات في سيلفرلايت

شكل 11 - تطبيق مستعرض الملفات في سيلفرلايت

مشاهدة المشروعالتحميل

 

خاتمة

تم بحمد الله. كانت هذه بعض الأمثلة البسيطة، وفي دروس أخرى بإذن الله تعالى نعطي أمثلة أكثر وتطبيقات أكثر بتفاصيل وشرح مفصل أكثر.

 

مواضيع مشابهة:

اخترنا لك:

أحدث المواضيع:

هل أعجبتك؟ شارك بها...