PDA

View Full Version : سوال: چگونگی ایجاد یک فرمت (فایل) اختصاصی برای نرم افزار در #c



yusof samadi
چهارشنبه 13 فروردین 1399, 20:08 عصر
سلام دوستان:لبخند:

یک سوال بدجوری ذهنم رو درگیر کرده.
اینکه چجوری میشه یک فرمت اختصاصی برای نرم افزار نوشته شده با سیشارپ تولید کنیم که برنامه ما قابلیت ذخیره کردن و خواندن اطلاعات درون اون فایل رو داشته باشه

برای مثال : تو فتوشاپ ما عکس رو با فرمت اختصاصی PSD ذخیره میکنیم بعد اون فایل با خود نرم افزار فوتوشاپ باز میشه و آیکون فتوشاپ روی اون فایل قرار گرفته.
من میخوام همین کار رو برای اپلیکیشن خودم انجام بدم

the king
چهارشنبه 13 فروردین 1399, 20:44 عصر
سلام دوستان:لبخند:

یک سوال بدجوری ذهنم رو درگیر کرده.
اینکه چجوری میشه یک فرمت اختصاصی برای نرم افزار نوشته شده با سیشارپ تولید کنیم که برنامه ما قابلیت ذخیره کردن و خواندن اطلاعات درون اون فایل رو داشته باشه

برای مثال : تو فتوشاپ ما عکس رو با فرمت اختصاصی PSD ذخیره میکنیم بعد اون فایل با خود نرم افزار فوتوشاپ باز میشه و آیکون فتوشاپ روی اون فایل قرار گرفته.
من میخوام همین کار رو برای اپلیکیشن خودم انجام بدم

رجوع شود به تاپیک هایی مثل :
باز کردن فایلها با پروژه سی شارپ مانند پلیرها؛ File Association

(https://barnamenevis.org/showthread.php?482545-%D8%A8%D8%A7%D8%B2-%DA%A9%D8%B1%D8%AF%D9%86-%D9%81%D8%A7%DB%8C%D9%84%D9%87%D8%A7-%D8%A8%D8%A7-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE-%D9%85%D8%A7%D9%86%D9%86%D8%AF-%D9%BE%D9%84%DB%8C%D8%B1%D9%87%D8%A7%D8%9B-File-Association)سوال: اضافه کردن یک عمل جدید به راست کلیک ویندوز

(https://barnamenevis.org/showthread.php?475368-%D8%A7%D8%B6%D8%A7%D9%81%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-%DB%8C%DA%A9-%D8%B9%D9%85%D9%84-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%A8%D9%87-%D8%B1%D8%A7%D8%B3%D8%AA-%DA%A9%D9%84%DB%8C%DA%A9-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2)چگونه کاری کنیم که فایل هایی با پسوند خاص فقط توسط برنامه ما قابل اجرا باشد؟ File Association (https://barnamenevis.org/showthread.php?474166-%DA%86%DA%AF%D9%88%D9%86%D9%87-%DA%A9%D8%A7%D8%B1%DB%8C-%DA%A9%D9%86%DB%8C%D9%85-%DA%A9%D9%87-%D9%81%D8%A7%DB%8C%D9%84-%D9%87%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-%D9%BE%D8%B3%D9%88%D9%86%D8%AF-%D8%AE%D8%A7%D8%B5-%D9%81%D9%82%D8%B7-%D8%AA%D9%88%D8%B3%D8%B7-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%85%D8%A7-%D9%82%D8%A7%D8%A8%D9%84-%D8%A7%D8%AC%D8%B1%D8%A7-%D8%A8%D8%A7%D8%B4%D8%AF%D8%9F-File-Association)

دریافت آرگومان جدید (نام چند فایل) توسط یک نمونه از برنامه در حال اجرا؛ Single Instance App (https://barnamenevis.org/showthread.php?525561-%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA-%D8%A2%D8%B1%DA%AF%D9%88%D9%85%D8%A7%D9%86-%D8%AC%D8%AF%DB%8C%D8%AF-(%D9%86%D8%A7%D9%85-%DA%86%D9%86%D8%AF-%D9%81%D8%A7%DB%8C%D9%84)-%D8%AA%D9%88%D8%B3%D8%B7-%DB%8C%DA%A9-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A7%D8%B2-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%AF%D8%B1-%D8%AD%D8%A7%D9%84-%D8%A7%D8%AC%D8%B1%D8%A7%D8%9B-Single-Instance-App)

و نمونه کد هایی مثل :
NET Shell Extensions - Shell Context Menus. (https://www.codeproject.com/Articles/512956/NET-Shell-Extensions-Shell-Context-Menus)

yusof samadi
چهارشنبه 13 فروردین 1399, 21:25 عصر
رجوع شود به تاپیک هایی مثل :
باز کردن فایلها با پروژه سی شارپ مانند پلیرها؛ File Association

(https://barnamenevis.org/showthread.php?482545-%D8%A8%D8%A7%D8%B2-%DA%A9%D8%B1%D8%AF%D9%86-%D9%81%D8%A7%DB%8C%D9%84%D9%87%D8%A7-%D8%A8%D8%A7-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE-%D9%85%D8%A7%D9%86%D9%86%D8%AF-%D9%BE%D9%84%DB%8C%D8%B1%D9%87%D8%A7%D8%9B-File-Association)سوال: اضافه کردن یک عمل جدید به راست کلیک ویندوز

(https://barnamenevis.org/showthread.php?475368-%D8%A7%D8%B6%D8%A7%D9%81%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-%DB%8C%DA%A9-%D8%B9%D9%85%D9%84-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%A8%D9%87-%D8%B1%D8%A7%D8%B3%D8%AA-%DA%A9%D9%84%DB%8C%DA%A9-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2)چگونه کاری کنیم که فایل هایی با پسوند خاص فقط توسط برنامه ما قابل اجرا باشد؟ File Association (https://barnamenevis.org/showthread.php?474166-%DA%86%DA%AF%D9%88%D9%86%D9%87-%DA%A9%D8%A7%D8%B1%DB%8C-%DA%A9%D9%86%DB%8C%D9%85-%DA%A9%D9%87-%D9%81%D8%A7%DB%8C%D9%84-%D9%87%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-%D9%BE%D8%B3%D9%88%D9%86%D8%AF-%D8%AE%D8%A7%D8%B5-%D9%81%D9%82%D8%B7-%D8%AA%D9%88%D8%B3%D8%B7-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%85%D8%A7-%D9%82%D8%A7%D8%A8%D9%84-%D8%A7%D8%AC%D8%B1%D8%A7-%D8%A8%D8%A7%D8%B4%D8%AF%D8%9F-File-Association)

دریافت آرگومان جدید (نام چند فایل) توسط یک نمونه از برنامه در حال اجرا؛ Single Instance App (https://barnamenevis.org/showthread.php?525561-%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA-%D8%A2%D8%B1%DA%AF%D9%88%D9%85%D8%A7%D9%86-%D8%AC%D8%AF%DB%8C%D8%AF-(%D9%86%D8%A7%D9%85-%DA%86%D9%86%D8%AF-%D9%81%D8%A7%DB%8C%D9%84)-%D8%AA%D9%88%D8%B3%D8%B7-%DB%8C%DA%A9-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A7%D8%B2-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%AF%D8%B1-%D8%AD%D8%A7%D9%84-%D8%A7%D8%AC%D8%B1%D8%A7%D8%9B-Single-Instance-App)

و نمونه کد هایی مثل :
NET Shell Extensions - Shell Context Menus. (https://www.codeproject.com/Articles/512956/NET-Shell-Extensions-Shell-Context-Menus)

فقط یکی از تاپیک ها همانند و جواب سوال من بود که هیچگونه توضیحی داده نشده بود.
هدف من یادگیری است نه اینکه مستقیم کد رو کپی کنم تو برنامه!
من میخوام بدونم تو اون کد چه اتفاقی داره میوفته!

the king
پنج شنبه 14 فروردین 1399, 00:01 صبح
فقط یکی از تاپیک ها همانند و جواب سوال من بود که هیچگونه توضیحی داده نشده بود.
هدف من یادگیری است نه اینکه مستقیم کد رو کپی کنم تو برنامه!
من میخوام بدونم تو اون کد چه اتفاقی داره میوفته!
یک اتفاق خیلی ساده می افته، در Registry ویندوز کلید و داده به ثبت میرسه. خودش اینکار پیچیدگی خاصی نداره که شرحی بخواد.
برای کار در Registry ویندوز از Microsoft.Win32.Registry استفاده میشه، که خودش زیرمجموعه هایی مثل LocalMachine و ClassesRoot و ... داره.
فرضا اگر بخواهیم در ClassesRoot یک کلید جدید به ثبت برسونیم (یا بازش کنیم) با Microsoft.Win32.Registry.ClassesRoot.CreateSubKey اینکار رو انجام می دهیم.
یا بخواهیم به کلید باز شده مقدار بدهیم با SetValue اینکار رو انجام می دهیم. پیچیدگی خاصی نداره.

سوال اول و سوال دوم تون دو تا موضوع کاملا متفاوت ئه. در شرح یک کد برنامه آموزش مفصلی در مورد ساختار داخلی سیستم عامل داده نمیشه.
شرح اون کد ها خیلی ساده است. میگه در فلان قسمت از Registry کلید و داده فلان رو ثبت کنید تا فلان پسوند فایل برای اجرا با برنامه بهمان به ثبت برسه.
یعنی ذر کد اتفاق خاصی رخ نمیده که توضیح زیادی بخواد، صرفا در Registry ویندوز یکسری داده به ثبت میرسه. هم مسیری که به ثبت میرسه مشخص هست و هم داده داخل شون.
توضیح خاص و طولانی ای ندارند چون اصل قضیه مربوط به ساختار Explorer ویندوز ئه که ربطی به اون کد ها و شرح شون نداره.

اما سوال دوم تون مربوط به نحوه استفاده Explorer ویندوز از Registry است. اون چیزی که باید در موردش مطالعه کنید خود اون کد ها نیست.
مطالعه کاربرد داده هایی که فرضا در HKEY_CLASSES_ROOT نوشته میشه کمک تون می کنه که دلیل ثبت اون کلید ها و داده ها رو متوجه بشوید.
مطالب مفصلی است. اندازه یک فصل کتاب مطلب داره :

Verbs and File Associations (https://docs.microsoft.com/en-us/windows/win32/shell/fa-verbs)

Creating Shortcut Menu Handlers (https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers)

Explorer ویندوز برای اینکه پسوند فایل ها و آیکون شون و ... رو شناسایی کنه به یک مسیر های خاصی از Registry ویندوز رجوع می کنه، که فرضا ببینه پسوند bmp برای باز شدن با کدوم فرمان ها و با کدوم برنامه ها و با چه آیکونی ثبت شده. هر تغییری که در اون مسیر ها بدید و کلید و داده جدیدی به ثبت برسونید روی چیزی که Explorer ویندوز نشون میده تاثیر میذاره.
در همه اون کد هایی که برای اینکار نوشته میشه، در Registry کلید و داده هایی ثبت می کنند که Explorer ویندوز میخونه. Explorer برای شناسایی فایل ها و آیکون شون و برنامه ای که بازش میکنه و گزینه هایی که در راست کلیک نشون میده و ... از اون بخش های خاص Registry استفاده می کنه.
کاری که کد انجام میده خیلی ساده است، فقط ثبت کلید و داده در Registry است، اما دلیلش شرح مفصلی داره.