PDA

View Full Version : کار با رجیستری



amir_civil
یک شنبه 20 آذر 1384, 23:17 عصر
سلام دوستان
کسی طرز ساختن یک کلید در رجیستری رو میدونه(ویژوال سی)

sh_roohani
دوشنبه 21 آذر 1384, 16:45 عصر
سلام،
این قطعه ای از کدیه که تو یکی از برنامه هام به کار بردم:


HKEY hkeySettings;
DWORD dwDisposition = 0;

RegCreateKeyEx(HKEY_CURRENT_USER, _T("Software\\TFI Co. Ltd.\\TFI Capture Station 1.0\\Settings\\Capture"),
0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hkeySettings, &dwDisposition);

RegSetValueEx(hkeySettings, _T("Create proxy"), 0, REG_BINARY, (CONST BYTE*)&m_bCreateProxy, sizeof(BOOL));

RegCloseKey(hkeySettings);

اول شما باید یه کلید رو با استفاده از یکی از کلیدهای پایه (که همیشه باز هستن) باز کنین. مثلا با استفاده از HKEY_CURRENT_USER یا HKEY_LOCAL_MACHINE می تونین اینکار رو بکنین.RegCreateKeyEx اگه کلید باشه، اونو باز می کنه، وگرنه اونو ایجاد می کنه. بعدش با RegSetValueEx توی اون یه زیرکلید بسازین و بهش مقدار بدین. اینکار رو برای هر چند تا زیر کلید که بخواین می تونین با RegSetValueEx تکرار کنین. در آخر هم کلیدی رو که باز کردین با RegCloseKey ببندین.
امیدوارم به دردتون بخوره.

amir_civil
دوشنبه 21 آذر 1384, 20:22 عصر
با سلام
خیلی ممنون از جوابتون
من این کار رو برای اجرای دوباره برنامه از طریق رجیستری میخاستم
میشه بگید باید چیکار کنم
و در مورد دستور زیر توضیح بدین

RegCreateKeyEx(HKEY_CURRENT_USER, _T("Software\\TFI Co. Ltd.\\TFI Capture Station 1.0\\Settings\\Capture"),
ممنون

C++Lover
دوشنبه 21 آذر 1384, 23:04 عصر
خیلی Win32 API شد.
می تونید از کلاس CRegKey که از کلاسهای ATL است استفاده کنید.
نمی گم چیز فوق العاده ای هست اما در مورد Query ها کار رو خیلی آسون کرده. در ضمن تو destructor کلاس هندل رجیستری close می شه و بافر هم خالی میشه. خلاصه زحمت کد نوشتن رو کم می کنه.
در ضمن خصلت تمام کلاسهای ATL اینه که OverHead بسیار کمی رو تحمیل می کنه که نسبت به کارآیی شون ارزش داره.



CRegKey k(HKEY_CURRENT_USER);
k.Create(k, _T("Software\\TFI Co. Ltd.\\TFI Capture Station 1.0\\Settings\\Capture"));


بعد از create کردن، هندل جاری به مکان ساخته شده ست می شه.

sh_roohani
سه شنبه 22 آذر 1384, 11:54 صبح
راستش من تا حالا با این CRegKey کار نکردم و میونه خوبی هم با ATL ندارم (البته از MFC هم چندان خوشم نمیاد، ولی خوب یه جورایی مجبورم باهاش کار کنم!)، ولی با این اوصاف که C++ Lover فرمودن باید چیز خوبی باشه.
در مورد تابع RegCreateKeyEx هم عرض می شه که، این تابع کلیدی رو که (به صورت یه رشته کاراکتری) بهش پاس شده، در رجیستری ایجاد و باز می کنه، یا اگه اون کلید قبلا وجود داشته باشه، فقط اونو باز می کنه. بعدش دیگه شما می تونید با RegSetValueEx زیرکلیدهای جدیدی برای کلیدی که تازه باز کردین ایجاد کنین و بهشون مقدار بدین، یا اگه قبلا اون زیرکلیدها وجود داشتن، فقط مقدار جدیدشونو تنظیم کنین.
در مورد اجرای دوباره برنامه از طریق رجیستری هم راستش متوجه منظورتون نشدم، لطفا دقیقا بفرمایین که می خواین چیکار کنین، شاید بدونم.

amir_civil
سه شنبه 22 آذر 1384, 14:18 عصر
سلام دوستان
و ممنون از جوابهاتون
بیبنیند من میخام برنامم با ران شدن ویندوز اجرا بشه
همین

sh_roohani
سه شنبه 22 آذر 1384, 18:46 عصر
سلام،
خوب ببینید، در رجیستری یه کلیدی هست به نشانی زیر:

HKEY_CURRENT_USER\Software\Microsoft\Windows\Curre ntVersion\Run
شما می تونین واسه هر برنامه ای که می خوان موقع startup اجرا بشه، با RegSetValueEx یه زیرکلید واسه این کلید بسازین، با یه اسمی که خودتون دوست دارین و بهش مقدار بدین. حالا این مقدار باید آدرس کامل فایلی باشه که می خواین اجرا بشه.
دفعه بعد که ویندوز بالا بیاد، اون فایل اجرا می شه.

amir_civil
چهارشنبه 23 آذر 1384, 01:28 صبح
سلام
خیلی ممنون ازپاسختون
اگه میشه بگید که من چه جوری میتونم هندل برنامه وینمپ رو بدست بیارم
ممنون

C++Lover
چهارشنبه 23 آذر 1384, 03:50 صبح
راستش من تا حالا با این CRegKey کار نکردم و میونه خوبی هم با ATL ندارم (البته از MFC هم چندان خوشم نمیاد، ولی خوب یه جورایی مجبورم باهاش کار کنم!)، ولی با این اوصاف که C++ Lover فرمودن باید چیز خوبی باشه.


در مورد MFC خود من هم زیاد دل خوشی ازش ندارم اما در مورد ATL یه خورده کم لطفی می کنید.
به نظر من ATL یه شاهکاره البته این عقیده من بعد از مدتها کار با ATL و WTL و MFC هستش.
لازم به ذکره که هر کدوم از این دوتا معایب و محسناتی دارند که نباید اونها رو ندیده گرفت. در ضمن مکمل هم دیگه هم هستند.

sh_roohani
چهارشنبه 23 آذر 1384, 12:35 عصر
در مورد MFC خود من هم زیاد دل خوشی ازش ندارم اما در مورد ATL یه خورده کم لطفی می کنید.
به نظر من ATL یه شاهکاره البته این عقیده من بعد از مدتها کار با ATL و WTL و MFC هستش.
لازم به ذکره که هر کدوم از این دوتا معایب و محسناتی دارند که نباید اونها رو ندیده گرفت. در ضمن مکمل هم دیگه هم هستند.
خوب، در مورد ATL با توجه به اینکه اطلاعاتم خیلی کمه نمی تونم بیشتر از این اظهار نظری بکنم.

اگه میشه بگید که من چه جوری میتونم هندل برنامه وینمپ رو بدست بیارم
برای به دست آوردن هندل یه پنجره Top level باید عنوان اون پنجره و کلاس اون پنجره رو بدونین و بعدش با FindWindow هندل اونو به دست بیارید.
اگر هم می خواین Child window رو پیدا کنین از FindWindowEx استفاده کنین.

amir_civil
چهارشنبه 23 آذر 1384, 13:21 عصر
سلام
باید بگم که دقیقا مشکل من در بدست اوردن کلاس پنجره هست که اگه راهنمای کنید ممنون میشم

sh_roohani
چهارشنبه 23 آذر 1384, 14:18 عصر
خوب، ببینید. Visual C++ 6.0 یه ابزاری داره به اسم ++Spy. توی اون هم یه ابزاری هست به اسم Find Window. می تونید با استفاده از اون کلاس هر پنجره ای رو روی Desktop به دست بیارید و بعد ازش استفاده کنید. طرز کارش خیلی ساده س. فقط باید این نکته رو در نظر داشته باشید که توسعه دهندگان Winamp ممکنه دلشون بخواد تو یه نسخه جدید از یه اسم دیگه واسه کلاس پنجره اصلی برنامه شون استفاده کنن!

amir_civil
چهارشنبه 23 آذر 1384, 21:35 عصر
واقعااز شما ممنونم
تشکر

sh_roohani
پنج شنبه 24 آذر 1384, 10:19 صبح
خواهش دارم.