02-11-13, 10:05 PM
(آخر تعديل لهذه المشاركة : 02-11-13, 11:46 PM {2} بواسطة الشاكي لله.)
السلام عليكم ورحمة الله وبركاته
Thumbnail او الصور الرمزية هي صور تشير الى محتوى الملف
لنأخذ بالمثال الكتب الاكترونية ذات الامتداد (PDF.)
كما ترى الملف dotNet 2008 يوجد لديه Thumbnail وهو يشير الى غلاف
الكتاب .
--
--
--
طيب لو انا سويت امتداد جديد (مثلا cfg) ، وسويت ملف بهذا الامتداد
كيف سيعرض هذا الملف !!!
لو انا حبيت احط صورة رمزية Thumbnail يعبر عن محتوى هذا الملف
كما حصل في الملف dotNet 2008 ..
كيف سأقوم بذلك ؟؟
--
--
--
هناك مكتبة تدعى SharpShell وهي مكتبة متخصصة في هذا الموضوع
سنكتب بواسطتها كود يقوم باستخراج صورة من الملف نفسه (الذي بالامتداد cfg)
كما في dotNet 2008 حيث ان الوندوز قام باخذ اول صفحة من الكتاب وجعلها
Thumbnail له .
اذن الThumbnail يتم سحبه من الملف نفسه . فيجب عليك البحث عن طريقة
لحفظ الصورة في الملف .. مثلا اخونا سجاد في شرحه لxml
حيث انه استعمل طريقة لحفظ صورة في ملف xml ..
فيمكننا مثلا ان نقوم بعمل Thumbnail للملف xml من خلال بيانات الصورة الموجودة داخله .
في هذا المقال .. راح نسوي ملف نصي ونضع في اول سطر رابط لصورة موجودة على الانترنت ونحفظ الملف كالامتداد cfg
وسيقوم الThumbProviderبتحميل الصورة من الرابط ويضعها ك Thumbnail للملف
اتمنى وضحت الفكرة.
--
--
--
طيب نجي للتطبيق :-
[color=#4B0082[/color]]اولا : يجب ان يكون لديك Visual studio 2010 او 2010 #C او حتى فيجوال
بيسك 2010
ولكن عليك بتحويل الكود الى الفيجوال بيسك لان المقالة تعتمد على السي شارب
..
ثانيا : إنشاء مشروع جديد باسم ThumbProvider من نوع Class library
..
ثالثا : اضف المكتبات الضرورية ك System.Drawing و SharpShell
--
رابعا : الكود سيكون بهذه الطريقة :-[/color]
الدالة GetThumbnailImage هي المسؤولة عن إستخراج صورة (Tumb) ووضعها للملف
هذه الدالة يقوم بطلبها مستكشف الوندوز Windows Explorer للغرض المذكور اعلاه .
--
--
--
نأتي لشرح الاسطر المهمة في هذا الكود
لاحظ قمنا بوضع cfg. اي ان هذا المشروع كله لكي يجلب Thump فقط للملفات ذات
الامتداد cfg. فإذا كان امتدادك باسم اخر استبدله بهذا الامتداد.
..
Guid : كما جرت العادة في مكتبات COM حيث يجب تعريف دليل للكلاس
حيث يجب ان يكون هذا الكلاس من نوع COM وذلك لأن الوندوز لايقبل سوى COM
في الواقع كتابة هذا المشروع طويل ومتعب .. لكن بفضل مكتبة SharpShell
قمنا بكتابة الThumpProvider بكل سهولة وبواسطة دالة واحدة فقط
--
الشيئ المهم في هذا الكود هي الخاصية SelectedItemStream
فهي خاصية يتم اسناد القيمة اليها من خلال Windows Explorer
وهي عبارة عن Stream للملف ، والكل يعرف Stream (التي من خلالها نستطيع قرائة/كتابة) ملف
--
الكود المسؤول عن اعطاء thumbnail للملف هو هذا :-
وظيفة الكود هو اخذ اول سطر من الملف الي المفروض يكون رابط لصورة ، ويقوم بتحميل الصورة
ثم إرجاع الصورة .. وفور ارجاع الصورة ال Windows explorer ، سيقوم بعرضها على الملف .
--
--
--
الان بقي شيئ واحد وهو تسجيل الThumpProvider الي سويناه + تنصيبه
لكي يستطيع الWindows Explorer استدعائه عندما يريد عرض Tumpnail
لاحد الملفات ذات الامتداد cfg
ولكن اولا سنقوم بعمل Strong name للمشروع
وذلك من خلال My Project > Signing > (check) sign
this assemble واكتب اي اسم
كما في الصورة :-
وبعدها سو Build لينتج لنا ملف ThumbProvider.dll
--
--
--
الان قبل تسجيل الThumbProvider.dll على الوندوز سنقوم بتجريبه
هل سيقوم بعرض Thumbnail للملفات cfg او لا.
في البداية علينا فتح النوت باد وكتابة رابط لصورة
بعدها نحفظ الملف بصيغة cfg
..
الان علينا بتجريب المشروع ThumbProvider بالاحرى ملف ThumbProvider.dll
سنقوم باستعمال الاداة ServerManager.exe المرفقة
نقوم باضافة ملف ThumbProvider.dll من خلال File > Open
وبعد الاضافة نقوم بتجريب الThumbProvider من خلال Test Server in test shell
وبعدها ننزل وندور على الملف الي سويناه قبل شوي (test.cfg) ، والمفاجئة :
تماااام قام بتحميل الصورة من خلال الرابط الموجود في الملف ثم عرضها
الان نحتاج نشوفها على ارض الواقع . اي على Windows explorer
لهذا علينا تسجيل الThumpProvider وتنصيبه .. نقوم بذلك من خلال الاداة نفسها :
الان لتطبيق التغيرات في النظام عليك بعمل Restart للجهاز
نسوي ريستارت ونرجع ..[/color]
--
--
--
عدنا ..
الان لو تروح للملف الي سويناه (test.cfg) مابتشوف حصل شيئ فيه
ولا اعلم السبب صراحة . (اعتقد ان الملف المفروض مايكون موجود قبل التسجيل)
لذلك قم بحذفه واعد الخطوات
ستلاحظ ظهور الThumb اخيراااا
واذا تريد التأكد اكثر . قم بعمل ملف cfg مرة ثانية يحتوي على رابط لصورة اخرى
والنتيجة :-
وتنتهي الحكاية
--
--
--
الحين انت بتسألني بتقول "لو حبيت انشر برنامجي الى المستخدمين هل سأقول لكل شخص ان يقوم بتنزيل ServerManger ويقوم بتسجيل الThumpProvider"
فكما تتذكرون احنا قمنا بتسجيل الThumpProvider من خلال البرنامج
اذن كيف أستطيع تسجيل وتنصيب ال Provider من خلال الكود (برمجيا) ؟؟ :
بعد عدة محاولات استطعت اخيرا تنفيذ هذه العملية بواسطة دالتين
دالة لتسجيل الProvider والاخرى لتنصيبه :
وهذا هو التطبيق
الامتداد + الدليل . تحصل عليه من الكود الي كتبناه سابقا في ThumbProvider
بالتحديد هذا الكود :-
--
--
--
إلى هنا تنتهي المقالة
اتمنى انها كانت خفيفة عليكم
المرجع :
NET Shell Extensions - Shell Thumbnail Handlers
((هذا الموضوع اهداء الى ali.alfoly)))
Thumbnail او الصور الرمزية هي صور تشير الى محتوى الملف
لنأخذ بالمثال الكتب الاكترونية ذات الامتداد (PDF.)
كما ترى الملف dotNet 2008 يوجد لديه Thumbnail وهو يشير الى غلاف
الكتاب .
--
--
--
طيب لو انا سويت امتداد جديد (مثلا cfg) ، وسويت ملف بهذا الامتداد
كيف سيعرض هذا الملف !!!
لو انا حبيت احط صورة رمزية Thumbnail يعبر عن محتوى هذا الملف
كما حصل في الملف dotNet 2008 ..
كيف سأقوم بذلك ؟؟
--
--
--
هناك مكتبة تدعى SharpShell وهي مكتبة متخصصة في هذا الموضوع
سنكتب بواسطتها كود يقوم باستخراج صورة من الملف نفسه (الذي بالامتداد cfg)
كما في dotNet 2008 حيث ان الوندوز قام باخذ اول صفحة من الكتاب وجعلها
Thumbnail له .
اذن الThumbnail يتم سحبه من الملف نفسه . فيجب عليك البحث عن طريقة
لحفظ الصورة في الملف .. مثلا اخونا سجاد في شرحه لxml
حيث انه استعمل طريقة لحفظ صورة في ملف xml ..
فيمكننا مثلا ان نقوم بعمل Thumbnail للملف xml من خلال بيانات الصورة الموجودة داخله .
في هذا المقال .. راح نسوي ملف نصي ونضع في اول سطر رابط لصورة موجودة على الانترنت ونحفظ الملف كالامتداد cfg
وسيقوم الThumbProviderبتحميل الصورة من الرابط ويضعها ك Thumbnail للملف
اتمنى وضحت الفكرة.
--
--
--
طيب نجي للتطبيق :-
[color=#4B0082[/color]]اولا : يجب ان يكون لديك Visual studio 2010 او 2010 #C او حتى فيجوال
بيسك 2010
ولكن عليك بتحويل الكود الى الفيجوال بيسك لان المقالة تعتمد على السي شارب
..
ثانيا : إنشاء مشروع جديد باسم ThumbProvider من نوع Class library
..
ثالثا : اضف المكتبات الضرورية ك System.Drawing و SharpShell
--
رابعا : الكود سيكون بهذه الطريقة :-[/color]
PHP كود :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using SharpShell.Attributes;
using SharpShell.SharpThumbnailHandler;
using System.Drawing;
using System.IO;
using System.Net;
namespace ThumbProvider
{
public class ThumbProvider
{
/// <summary>
/// The TxtThumbnailHandler is a ThumbnailHandler for .cfg files.
/// </summary>
[ComVisible(true)]
[COMServerAssociation(AssociationType.FileExtension, ".cfg")]
[Guid("38b1b369-87c0-381c-b37e-cba4909de666")]
public class ThumbnailHandler : SharpThumbnailHandler
{
/// <summary>
/// Gets the thumbnail image.
/// </summary>
/// <param name="width">The width of the image that should be returned.</param>
/// <returns>
/// The image for the thumbnail.
/// </returns>
protected override Bitmap GetThumbnailImage(uint width) //Add System.Drawing
{
// Attempt to open the stream with a reader.
try
{
using (StreamReader reader = new StreamReader(SelectedItemStream))
{
WebClient wc = new WebClient();
byte[] imgData = wc.DownloadData(reader.ReadLine());
MemoryStream ms = new MemoryStream(imgData);
Image thumb = Image.FromStream(ms);
return (Bitmap)thumb;
}
}
catch (Exception exception)
{
// Log the exception and return null for failure.
LogError("An exception occured opening the text file.", exception);
return null;
}
}
}
}
}
الدالة GetThumbnailImage هي المسؤولة عن إستخراج صورة (Tumb) ووضعها للملف
هذه الدالة يقوم بطلبها مستكشف الوندوز Windows Explorer للغرض المذكور اعلاه .
--
--
--
نأتي لشرح الاسطر المهمة في هذا الكود
PHP كود :
[COMServerAssociation
(AssociationType.FileExtension, ".cfg")]
[Guid("38b1b369-87c0-381c-b37e-cba4909de666")]
لاحظ قمنا بوضع cfg. اي ان هذا المشروع كله لكي يجلب Thump فقط للملفات ذات
الامتداد cfg. فإذا كان امتدادك باسم اخر استبدله بهذا الامتداد.
..
Guid : كما جرت العادة في مكتبات COM حيث يجب تعريف دليل للكلاس
حيث يجب ان يكون هذا الكلاس من نوع COM وذلك لأن الوندوز لايقبل سوى COM
في الواقع كتابة هذا المشروع طويل ومتعب .. لكن بفضل مكتبة SharpShell
قمنا بكتابة الThumpProvider بكل سهولة وبواسطة دالة واحدة فقط
--
PHP كود :
using (var reader = new StreamReader(SelectedItemStream))
الشيئ المهم في هذا الكود هي الخاصية SelectedItemStream
فهي خاصية يتم اسناد القيمة اليها من خلال Windows Explorer
وهي عبارة عن Stream للملف ، والكل يعرف Stream (التي من خلالها نستطيع قرائة/كتابة) ملف
--
الكود المسؤول عن اعطاء thumbnail للملف هو هذا :-
PHP كود :
WebClient wc = new WebClient();
byte[] imgData = wc.DownloadData(reader.ReadLine());
MemoryStream ms = new MemoryStream(imgData);
Image thumb = Image.FromStream(ms);
return (Bitmap)thumb;
وظيفة الكود هو اخذ اول سطر من الملف الي المفروض يكون رابط لصورة ، ويقوم بتحميل الصورة
ثم إرجاع الصورة .. وفور ارجاع الصورة ال Windows explorer ، سيقوم بعرضها على الملف .
--
--
--
الان بقي شيئ واحد وهو تسجيل الThumpProvider الي سويناه + تنصيبه
لكي يستطيع الWindows Explorer استدعائه عندما يريد عرض Tumpnail
لاحد الملفات ذات الامتداد cfg
ولكن اولا سنقوم بعمل Strong name للمشروع
وذلك من خلال My Project > Signing > (check) sign
this assemble واكتب اي اسم
كما في الصورة :-
وبعدها سو Build لينتج لنا ملف ThumbProvider.dll
--
--
--
الان قبل تسجيل الThumbProvider.dll على الوندوز سنقوم بتجريبه
هل سيقوم بعرض Thumbnail للملفات cfg او لا.
في البداية علينا فتح النوت باد وكتابة رابط لصورة
بعدها نحفظ الملف بصيغة cfg
..
الان علينا بتجريب المشروع ThumbProvider بالاحرى ملف ThumbProvider.dll
سنقوم باستعمال الاداة ServerManager.exe المرفقة
نقوم باضافة ملف ThumbProvider.dll من خلال File > Open
وبعد الاضافة نقوم بتجريب الThumbProvider من خلال Test Server in test shell
وبعدها ننزل وندور على الملف الي سويناه قبل شوي (test.cfg) ، والمفاجئة :
تماااام قام بتحميل الصورة من خلال الرابط الموجود في الملف ثم عرضها
الان نحتاج نشوفها على ارض الواقع . اي على Windows explorer
لهذا علينا تسجيل الThumpProvider وتنصيبه .. نقوم بذلك من خلال الاداة نفسها :
الان لتطبيق التغيرات في النظام عليك بعمل Restart للجهاز
نسوي ريستارت ونرجع ..[/color]
--
--
--
عدنا ..
الان لو تروح للملف الي سويناه (test.cfg) مابتشوف حصل شيئ فيه
ولا اعلم السبب صراحة . (اعتقد ان الملف المفروض مايكون موجود قبل التسجيل)
لذلك قم بحذفه واعد الخطوات
إقتباس :
بعدها نحفظ الملف بصيغة cfg
ستلاحظ ظهور الThumb اخيراااا
واذا تريد التأكد اكثر . قم بعمل ملف cfg مرة ثانية يحتوي على رابط لصورة اخرى
والنتيجة :-
وتنتهي الحكاية
--
--
--
الحين انت بتسألني بتقول "لو حبيت انشر برنامجي الى المستخدمين هل سأقول لكل شخص ان يقوم بتنزيل ServerManger ويقوم بتسجيل الThumpProvider"
فكما تتذكرون احنا قمنا بتسجيل الThumpProvider من خلال البرنامج
اذن كيف أستطيع تسجيل وتنصيب ال Provider من خلال الكود (برمجيا) ؟؟ :
بعد عدة محاولات استطعت اخيرا تنفيذ هذه العملية بواسطة دالتين
دالة لتسجيل الProvider والاخرى لتنصيبه :
PHP كود :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32;
using System.ComponentModel.Composition.Hosting;
bool Register(string extension ,string Guid)
{
try
{
//تسجيل الملف register
RegistryKey rBaseKey = Registry.ClassesRoot.CreateSubKey(extension,
RegistryKeyPermissionCheck.ReadWriteSubTree).CreateSubKey("shellex", RegistryKeyPermissionCheck.ReadWriteSubTree);
RegistryKey rChildkey = rBaseKey.CreateSubKey("{e357fccd-a995-4576-b01f-234630154e96}",
RegistryKeyPermissionCheck.ReadWriteSubTree);
rChildkey.SetValue("", "{" + Guid + "}");
rBaseKey.Close();
rChildkey.Close();
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
}
bool Installer(string assamblyPath, string Guid)
{
//التنصيب install
try
{
AssemblyCatalog catalog = new AssemblyCatalog(assamblyPath);
Type cls = (Type)catalog.Assembly.GetTypes().Where(t => t.GUID.ToString() == Guid).First();
RegistryKey iBaseKey = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Classes\CLSID\" + "{" + Guid + "}",
RegistryKeyPermissionCheck.ReadWriteSubTree);
RegistryKey iChildKey = iBaseKey.CreateSubKey("InprocServer32", RegistryKeyPermissionCheck.ReadWriteSubTree);
iChildKey.SetValue("", "mscoree.dll");
iChildKey.SetValue("Assembly", catalog.Assembly.FullName);
iChildKey.SetValue("Class", cls.FullName);
iChildKey.SetValue("CodeBase", @"file:///" + assamblyPath);
iChildKey.SetValue("RuntimeVersion", catalog.Assembly.ImageRuntimeVersion);
iChildKey.SetValue("ThreadingModel", "Both");
//
//
RegistryKey iLastKey = iChildKey.CreateSubKey("1.0.0.0", RegistryKeyPermissionCheck.ReadWriteSubTree);
iLastKey.SetValue("Assembly", catalog.Assembly.FullName);
iLastKey.SetValue("Class", cls.FullName);
iLastKey.SetValue("CodeBase", @"file:///" + assamblyPath);
iLastKey.SetValue("RuntimeVersion", catalog.Assembly.ImageRuntimeVersion);
iBaseKey.Close();
iChildKey.Close();
iLastKey.Close();
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
}
وهذا هو التطبيق
الامتداد + الدليل . تحصل عليه من الكود الي كتبناه سابقا في ThumbProvider
بالتحديد هذا الكود :-
PHP كود :
[COMServerAssociation
(AssociationType.FileExtension, ".cfg")]
[Guid("38b1b369-87c0-381c-b37e-cba4909de666")]
--
--
--
إلى هنا تنتهي المقالة
اتمنى انها كانت خفيفة عليكم
المرجع :
NET Shell Extensions - Shell Thumbnail Handlers
((هذا الموضوع اهداء الى ali.alfoly)))