View Full Version : چند سوال در مورد COM , Shell Extension, WMI ولی مرتبط
r00tkit
سه شنبه 02 آذر 1389, 18:02 عصر
سلام
موارد زیر منظور با استفاده از Cخالی هستش یا Qt
برای نوشتن یه Shell Extension حتما" باید به COM تسلط داشت؟ اگه بله، تا چه اندازه ؟ با C نمی شه؟
برای استفاده از WMI در C باید به COM تسلط پیدا کرد ؟ بدون COM نمی شه ؟
اصلا" این اقای COM چیه(client ,interface,CoInitializeEx,...) ؟ چه ربطی به MFC داره ؟ تو mfc از COM استفاده می شه
من یه پروژه native در VS درست می کنم! این پروژه می تونه یه COM باشه/ از COM استفاده کنه ؟
بعضی چیز ها که می گن رابطش COM هستش رو می شه بدون COM ازش استفاده کرد
مثل:TAPI 3.0و WMI و ....
----------------
گوگل و ویکی رو معرفی نکنید که قبلا" کلی سرچ کردم و این سوال ها حکم یه defrag رو داره
sh4mid
چهارشنبه 03 آذر 1389, 10:04 صبح
سلام
اگر اطلاعات اضافی خواستی vc shell programming (http://www.amazon.com/Visual-C-Windows-Shell-Programming/dp/1861001843)
در مورد مابقی اطلاعات درست ندارم شرمنده
mehdi.mousavi
جمعه 05 آذر 1389, 11:38 صبح
سلام.
برای نوشتن یه Shell Extension حتما" باید به COM تسلط داشت؟ اگه بله، تا چه اندازه ؟ با C نمی شه؟متاسفانه یا خوشبختانه، گستره Shell وسیع هستش. اگر منظورتون از Shell Extension تواناییهای پیشرفته Shell باشه، بله. دسترسی و استفاده از اونها از طریق COM میسر هستش. اما اگر منظورتون کارهای پایه ای باشه، خوب، Win32 API هایی برای (بطور نمونه) کپی کردن فایلها، استخراج Icon ها از فایلهای exe و ... وجود داره که جزء دسته برنامه نویسی Shell در نظر گرفته میشن. از طرف دیگه COM چیزی نیستش که بگم مثلا اگر 50 صفحه از فلان کتاب رو یاد بگیرید، بقیه اش رو میتونید به مرور زمان یاد بگیرید. نوشتن برخی از Extension ها ساده هستش اما همین سادگی بدون دونستن COM میشه Copy & Paste که ممکنه تو درد سر بندازتتون. فرضا ممکنه بدون اینکه متوجه باشید دستوراتی رو بصورت Serial پردازش کنید، در نتیجه، Explorer رو معطل پردازش یک دستور کنید، در حالیکه میتونستید در Thread های مختلف این کار رو انجام بدید. یا بدون اینکه اطلاع داشته باشید، متودهاتون رو Thread-Safe ننویسید و Shell کامپوننت شما رو همزمان از چند Thread فراخوانی کنه و با Race Condition مواجه بشید (من البته قدری بیش از نیاز دارم شما رو میترسونم که سراغ COM نرید، چرا؟ به زودی میگم...).
برای استفاده از WMI در C باید به COM تسلط پیدا کرد ؟ بدون COM نمی شه ؟ ببینید، اگر می خواهید کورکورانه کاری رو انجام بدید، می تونید یه تکه کد روی اینترنت پیدا کنید، Copy & Paste کنید و احتمالا خوشحال باشید که کد شما کار میکنه و به هدفتون رسیده اید. اما اگر بخوام واقع بینانه به سوال شما جواب بدم، باید بگم باید برای کار با WMI با COM آشنا (نه اینکه بهش مسلط) باشید.
اصلا" این اقای COM چیه(client ,interface,CoInitializeEx,...) ؟خوب، سوال اصلی همینه. اصلا COM چیه؟ همونطوریکه مطلعید، یکی از رایج ترین روشها برای نوشتن کدهای Reusable استفاده از Library ها هستش. وقتی شما الگوریتم مورد نظرتون رو در یک Library قرار میدید و اونو با دیگران به اشتراک میذارید، هر کسی Library مربوطه رو به کد خودش Link میکنه و اونو بر اساس نیازهای برنامه اش تغییر میده و سپس برنامه اش رو Compile میکنه. فرض کنیم که Compile شدن Lib مربوطه به برنامه باعث افزایش Executable Image نهایی به میزان مثلا 3MB بشه (فقط داریم فرض میکنیم، تا بتونم یکی از دلائل بوجود اومدن COM رو بهتون بگم). حالا فرض کنید End-User، چهار تا برنامه متفاوت از 4 شرکت مختلف رو که همشون از اون Lib استفاده کرده اند رو روی ماشینش نصب میکنه. این به این معنا هستش که روی اون ماشین، 4*3=12 مگابایت کد سربار وجود داره. حالا تو همین شرایط، فرض کنید من، توسعه دهنده اون Lib، یه مشکلی توی کدم پیدا میکنم و اونو رفع میکنم. حالا باید تمام اون 4 شرکتی که از Lib من استفاده کرده بودن رو مطلع کنم که اونها بر اساس زمان بندی خودشون، Lib جدید رو به برنامه اضافه کنن و برنامه رو دوباره Compile کرده و در اختیار End-User قرار بدن. برخیشون ممکنه اینکارو کنن، برخیشون ممکنه نکنن... در نتیجه، ایده Reusable بودن واقعی یک Component بدین ترتیب تحت الشعاع قرار میگیره. از سوی دیگه، استفاده از یک Lib در برنامه عموما به این معنا هستش که علاوه بر داشتن دانش پایه ای در مورد کاری که اون Lib انجام میده، از خود API های اون Lib هم سر در بیاریم و این باعث بشه نتونیم کد Loosely Coupled ای بنویسیم. (در نتیجه اون Lib حقیقتا یک Black Box نخواهد بود).
از سوی دیگه، اگر صنعت سخت افزار رو در نظر بگیریم، ما نرم افزاریها همیشه دوست داشتیم که دستمون مثل سخت افزاریها توی انتخاب Component های مختلف و استفاده از اونها در محصول نهایی، بدون درگیر شدن با جزییات هر یک باز باشه. درست همونطوریکه یه سخت افزاری یه Chip رو انتخاب میکنه، روی بوردش قرار میده و بهش به چشم یک Black Box نگاه میکنه، ما هم مایل بودیم تا چنین مکانیزمی در تولید نرم افزار داشته باشیم. یعنی استفاده از Component های Black Box ای که فقط کارکردشون برامون اهمیت داشته باشه و اینکه در درون هر یک چی میگذره از دید ما مخفی باشه.
علاوه بر اینها، DLL Hell هم یکی دیگه از دلائل بوجود اومدن COM بود. همه اینها + چند تا دلیل دیگه، باعث شد تا مایکروسافت تکنولوژی ای به اسم COM رو ارائه کنه، یه Binary-Based Modular Reusable سیستمی که بتونید یه Component رو در اون ایجاد کنید و فارغ از زبان برنامه نویسی ازش استفاده کنید. در صورت نیاز بتونید بدون دستکاری Interface ها، پیاده سازی متفاوتی برای همون عملکرد داشته باشید و ...
این تکنولوژی هم مثل بقیه تکنولوژیها، یه سری واژه و عبارات خاص خودش رو داره:
وقتی میگیم Interface منظورمون Binary Interface هستش،
یه زبان جدا برای تعریف جزییات Interface داریم به اسم IDL (یا Interface Definition Language)،
Component ای که ارائه میکنیم و الگوریتم مورد نظر در اون پیاده سازی کرده ایم رو به اسم COM Server می شناسیم،
به استفاده کننده از یه COM Server، یه COM Client میگیم،
نقل و انتقال داده ها در Context های مختلف رو Marshaling میگیم،
Component ها در محیطهایی به اسم "آپارتمان" ایجاد و استفاده میشن،
و خروارها خروار واژه و عبارت و مفهوم دیگه...
چه ربطی به MFC داره ؟ تو mfc از COM استفاده می شه MFC ربطی به COM نداره، اما، ساز و کارهایی داره که تولید COM Server ها رو ساده تر میکنه. اما عموم افراد ترجیح میدن به ATL برای تولید COM Component ها تکیه کنن تا MFC، بدین ترتیب کامپوننت مورد نظر Overhead و Dependency کمتری خواهد داشت. ATL خودش برای خودش دنیایی از اطلاعاته، که خوب یاد گرفتنش، مستلزم تولید و ارائه یه COM Component خوب هستش.
بعضی چیز ها که می گن رابطش COM هستش رو می شه بدون COM ازش استفاده کرد مثل:TAPI 3.0و WMI و ....خیر، نمیشه. به خصوص توی TAPI 3.0، اگر به COM مسلط باشید، میتونید DirectShow Filter Graph هایی بنویسید که بسیار توی کارهای تلفنی بهتون کمک میکنه. فرض کنید Echo Cancellation Component، DTMF Generator، DTMF Detector و ... اما همه اینها نیازمند تسلط داشتن به COM هستش.
اما چرا گفتم فعلا نرید سراغ COM؟ من معتقدم تا وقتی ما تکنولوژیهای اصلی رو نشناسیم و ندونیم چه چیزی بدلیل وجود چه مشکلاتی پیش اومده، نمیتونیم از اونها بهترین استفاده رو کنیم. شما باید در وهله اول به C++ تسلط پیدا کنید، بعد با RPC و OLE مدتی کد بنویسید تا برای یادگیری COM حاضر بشید.
موفق باشید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.