PDA

نسخه کامل مشاهده نسخه کامل : تغییر در رجیستری و استفاده از Com



cpplover
06-01-2008, 00:06
سلام به خدایان cpp در این تالار گفتگو........

چه کسی میتونه منو راهنمایی بده؟

میخواستم بدونم چطور میشه یک کلید از رجیستری رو با visual c++6 دستکاری کرد؟

دستوراتش رو میخواستم؟؟

cpplover
07-01-2008, 00:03
خیلی وقتها بعد از نصب ویندوز لازمه که یه سری تغییراتی رو خدمون
به صورت دستی در رجیستری بدیم مثلا مثل عدم نمایش recent document
افزایش پهنای باند و... حالا من میخوام برنامه ای بنویسم که این کارا رو واسه
خودم انجام بده منتها دنبال دستوراتی در visual c++ هستم که باهاش بتونم این
کارها رو بکنم ممکنه کسی این دستورات رو بگه؟

و اما سوال دوم : خیلی دوست دارم بدونم در همین زبان مثلا چطور میشه عکس دسکتاپ
رو عوض کرد و اصلا در ویندوز این کار چطوری ممکنه ؟
از دوستان عزیزی مثل m3hrz4d و someone تقاضای کمک دارم ؟؟؟

m3hrz4d
07-01-2008, 02:38
یک راه تغییر در رجیستری استفاده از ای پی آی ویندوز هست ولی اگه شما از MFC یا ATL استفاده میکنین میتونین از کلاس CRegKey استفاده کنین(برای استفاده در MFC فایل atlbase.h رو باید include# کنین).
اگه با رجیستری آشنا باشین کار کردن باش راحته.با متد Open ش و دادن یک Parent Key مثل HKEY_LOCAL_MACHINE و دادن آدرس یک Key مثل "Software\Microsoft\CurrentVersion\Run" یک Key رو به اصطلاح باز میکنین و میتونین با متد های مختلفی که داره Value های مورد نظر رو بخونین, عوض کنین یا ایجاد کنین و در آخر هم با متد Close اون Key رو میبندین:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

اگه زیاد با رجسیتری آشنا نیستن بهتره اول با خود رجیستری کار کنین . اونوقت خیلی راحت میتونین با برنامه نویسی هم رجیستری رو تغییر بدین...
--
چیزهایی مثل تغییر Background ویندوز تا تنظیمات Desktop و ... هم همه توی رجیستری ذخیره میشه و برای تغییرش باید رجیستری رو تغییر داد.

someone
08-01-2008, 21:46
سلام.

ممنون از توضیحات دوستم m3hrz4d
اما لازم دیدم چند نکته رو یادآوری کنم.


در Visual C شما نیاز به Invoke کردن مستقیم خیلی از API ها ندارین و برای بسیاری از اونها یک
wrapper نوشته شده. اینکه دوستمون گفتن از ATL استفاده کنین ، روش جالبی هست اما من به شخصه
توصیه نمیکنم.(بنا به دلایلی)
در هنگام نصب VC مجموعه ی نسبتا کوچکی (همراه با VS) تحت عنوان Platform SDK روی سیستم شما نصب
میشه که شامل یک سری فایل h , lib هست و این مجموعه به شما کمک میکنه تا برای ویندوز راحت تر بتونین
برنامه بنویسین. مثلا RegCreateKeyEx یک API برای ایجاد و یا بازکردن یک فایل Reg هست و شما در یک
پروژه MFC و یا Win32 میتونین از اون استفاده کنین.
البته این SDK شامل توابعی که پرکاربرد هستن میشه و برای در اختیار داشتن تمام توابع ویندوز (البته نه دقیقا
همه ی اونها) کافیه Windows SDK رو از سایت Microsoft دانلود کنین. (چیزی حدود 400MB)




اما در مورد تعویض عکس Desktop با نظر دوستمون موافق نیستم.
دلیلش هم روشنه. چنین تغییراتی باید در لحظه باشه اما وقتی شما Reg رو تغییر میدین برای مشاهده
تغییرات روی سیستم باید یک بار سیستم مجددا راه اندازی بشه. ( یا explore دوباره اجرا بشه)
در اینجا بحث کمی عوض میشه.
نمیدونم با COM آشنا هستین یا نه. COM یک معماری نرم افزاری برای به اشتراک گذاشتن
یک مولفه بدون وابستگی به Platform هست. به عبارتی دیگه تکنولوژی COM به شما این اجازه رو میده از
مجموعه ای که نوشتین در سایر زبان ها و مستقل از OS استفاده کنین.
برای دستکاری و کار کردن به اجزای Desktop واسط و به عبارت بهتر Interface ی وجود داره با نام
IActiveDesktop که مجموعه توابعی برای این کار رو در بر گرفته از جمله SetWallpaper .
برای استفاده از این Interface باید نمونه از اون داشته باشین که این کار با استفاده از CoCreateInstance
انجام میشه و ... با استفاده از این Object ها شما وارد دنیای جدیدتری میشین و احتمالا دیدتون راجع به
برنامه نویسی عوض میشه.


نمیدونم مشکلتون حل شده یا نه. اگه مایل بودین باهم بحث رو دنبال میکنیم.

راستی به عنوان یک دوست پیشنهاد میکنم در کنار VS تون حتما از MSDN استفاده کنین که بدون
اون برنامه نویسی برای ویندوز تقریبا غیرممکن هست.
موفق باشین.

cpplover
09-01-2008, 19:59
سلام مجدد



در مورد رجیستری بعدأ بیشتر صحبت خواهیم کرد اما الان میخواستم در مورد دسکتاپ بحث کنم
ببینید من بیشتر موضوعات رو در msdn مطالعه کردم و اتفاقأ مطالب زیادی هم دستگیرم شد اما تو کد نویسی اشکالات اساسی دارم
دوست دارم تا با هم بحث رو ادامه بدیم
در مورد IActiveDesktop صحبت کردید من کلیه توابع اون رو دیدم مثل AddDesktop ، AddUrl و .... اما در مورد استفاده از اونا مشکل داشتم اگه لطفی کنید در مورد استفاده از اونا یک مثال کوچک (مثل عوض کردن عکس دسکتاپ) بیارید ممنون میشم .
اون طوری که من متوجه شدم برای دستیابی به دسکتاپ فعال باید اشیا دسکتاپ فعال خلق بشن (CLSID_Active Desktop ) و به قول شما با استفاده ازتابع CoCreateInstance یک اشاره گر به اشیا
IActiveDesktop بازیابی میشه !
اما خوب به خاطر تازه کار بودن میخوام در مورد انجام کار و حتی محل کپی کردن کد ها تو ضیح بدید چون خیلی از کدهایی رو هم که دیدم نتونستم اجرا کنم ضمنا header مربوطه (shlobj ) رو هم کپی کردم .
با تشکر

someone
10-01-2008, 18:05
دوباره سلام!

اول از همه باید توجه داشته باشین که تنها اضافه کردن shlobj.h کافی نیست.
شما نیاز به اضافه کردن wininet.h هم دارین.
wininet.h باید بعد از stdafx.h و قبل از shlobj.h باشه.
مثلا به شکل زیر :


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


اما اگه باز در هنگام اجرا برنامه دوباره پیامی مبنی بر ناشناس بودن IActiveDesktop دارین، فایل
stdafx.h رو باز کنین و wininet.h رو در محل زیر قرار بدین :


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


بعد از این مرحله یک اشاره گر به واسط IActiveDesktop ایجاد میکنیم.
این تعریف رو در فایل h برنامه انجام می دیم و به اصطلاح یک عضو private از کلاس Dialog برنامه ایجاد میکنیم.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


به تابع OnInitDialog رفته و کدهای زیر رو در اون قرار میدیم :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


با توجه به اینکه شما MSDN رو در اختیار دارین من از توضیحات بیشتر خودداری میکنم
اما اگه جایی نیاز به توضیح داشت ، خبر بدین.


یک Button روی فرم اضافه کنین و کد زیر رو در اون وارد می کنیم :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

الان اگه برنامه رو اجرا کنین با اجرا Button ، تصویر A که در درایو C قرار داره به عنوان Wallpaper انتخاب میشه
و شما میتونین تغییرات رو مشاهده کنین.

اگه از VC6.0 استفاده میکنین در MessageBox و SetWallpaper نیازی به استفاده از T_ نیست.


باز هم تاکید میکنم اگه جایی از کد نیاز به توضیح داشت ، خبر بدین.
موفق باشین.

cpplover
11-01-2008, 10:13
سلام
چیزهایی که نوشتید خیلی عالی جواب دادند فقط اگر ممکنه بگید در stdafx.h مربوط به یک برنامه دیالوگ دقیقا چه اتفاقی میفته و فرضأ شما براساس چی اون کد رو در اون خط ها جاسازی کردید ؟
ولطفا توضیح مختصری در مورد کد های داخل OnInitDialog بدید؟
با تشکر

someone
11-01-2008, 14:06
دوباره سلام!

فایل stdafx.h در بردارنده تمامی Header ها و تعریف هایی هست که برای یک پروژه ی MFC لازمه.


فرضأ شما براساس چی اون کد رو در اون خط ها جاسازی کردید ؟


راستش من در این برنامه من" فرضا " عمل نکردم بلکه عملکرد من "قطعا" بوده!!!
توضیحش کمی مفصله.
در MSDN فایلی که برای IAvtiveDesktop معرفی شده shlobj.h هست. این فایل شامل تعریف های لازم برای
اجرای متودهای مربوط به COM هست. وقتی شما این فایل به به برنامه اضافه میکنین و باز مولفه ی شما
ناشناخته باقی میمونه باید دست به کار بشین و در فایل shlobj.h به دنبال تعریف ها و نحوه ی استفاده از اونها
بگردین.
برای این کار من فایل shlobj.h رو باز کردم و به دنبال ماکروهای شرطی در این فایل h گشتم.
به قسمت زیر رسیدم :


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

کد بالا بخشی از فایل shlobj.h هست. همونطور که مشخصه اگه _WININET_ تعریف نشده کدهای بعد از
ماکروی ifdef# اجرا نمیشن. علاوه بر این در توضیحات هم مشخصه که برای استفاده از structure های این
واسط ما نیاز به استفاده از wininet.h داریم. ضمنا _WININET_ در wininet.h تعریف شده.
خب! تا اینجا یک مرحله رو انجام دادیم!
مرحله بعدی تشخیص محل قرار گرفتن wininet.h هست. چیزی که مشخصه و اول به نظر میاد اینه هست که
wininet.h باید قبل از shlobj.h قرار بگیره. و بر همین اساس قاعدتا و با توجه به تعریفی از فایل stdafx.h شد
باید بعد از اون و یا در داخل اون قرار بگیره. که این بر میگرده به نسخه ای از VS که شما استفاده میکنین.
به عنوان مثال در VS2005 من این تغییر رو در فایل stdafx.h انجام دادم . نکته ای که وجود داره اینه :
ترتیب قرار گرفتن Header ها در VC بسیار مهم و حیاتیه.
مشکلی که با هم بررسیش کردیم از اون دسته مشکلاتی هست که واقعا برنامه نویس (کمی توسعه دهنده)
رو به چالش میکشه. چون اصلا reference مناسبی براش وجود نداره.


اما در مورد کدهایی که در OnInitDialog قرار گرفتن.

1- CoInitialize
قبل از اینکه ما بتونیم از مولفه های COM استفاده کنیم باید کتابخانه های COM رو حافظه بار کنیم.
با این کار میتونیم ا استفاده از یک اشاره گر به تخصیص دهنده حافظه ، به متود های مورد نظر دسترسی
داشته باشیم.

2- CoCreateInstance
اول بهتره چند تا تعریف داشته باشیم. هر COM شامل تعدادی کلاس که CoClass نا میده میشن و تعدادی
Interface هست که در برگیرنده متود های مورد نظر هستن وجود داره. برای استفاده از کلاس های COM باید
اونها Register شده باشن. هر کلاس دارای یک کد 64bit ی و یا 128bit ی ، یکتا هست. به عبارت دیکه شما دو
CoClass با کد های یکسان پیدا نمیکنین. وقتی شما یک COM رو در سیستم Register میکنین ، برای هر
کلاس یک کد در Registery سیستم عامل ثبت میشه. همینطور در مورد Interface ها.

تابع CoCreateInstance یک شئ از کلاس مورنظر ما روی سیستم محلی (local) ایجاد میکنه.
آرگومان اول id کلاس مورد نظر رو میگیره.
آرگومان دوم اشاره گری هست به واسط IUnknown که فعلا به اون کاری نداریم و به اون مقدار NULL میدیم.
آرگومان سوم وضعیت object جدیدی که ایجاد شده رو مشخص میکنه. که مقدار اون رو
CLSCTX_INPROC_SERVER در نظر گرفته شده. به این معنی که Object مورد نظر در یک Dll قرار داره که
در همون چرخه اجرا میشه.
آرگومان چهارم هم که id واسط مورد نظر هست.
آرگومان پنجم هم آدرس اشاره گر مورد نظر ما به واسط IActiveDesktop هست. که اون رو به صورت Private
تعریف کردیم.

مقدار برگشتی این تابع از نوع HRESULT هست که یا S_OK در صورت موفقیت و یا S_FALSE در صورت
پش اومدن مشکل هست.

در پایان هم باید با استفاده از CoUninitialize حافظه ای که برای بار شدن کتابخانه ی COM در نظر گرفته شده
آزاد میشه.


امیدوارم توضیحات واضح باشن.
اگه جایی مشکل داشت ، خبر بدین.
موفق باشین.