PDA

View Full Version : مشکل با RegSetValueEx



amir_civil
شنبه 21 اردیبهشت 1387, 13:52 عصر
با سلام
دوستان من وقتی از تابع

LONG WINAPI RegSetValueEx(
__in HKEY hKey,
__in LPCTSTR lpValueName,
DWORD Reserved,
__in DWORD dwType,
__in const BYTE* lpData,
__in DWORD cbData
);


با مقدار DWORD dwType

REG_DWORD
استفاده میکنم تو خود رجیستری مقدار رو قرار نمیده و میگه invalid DWORD value
من چه مقداری رو باید به جای lpData قرار بدم
ممنون

Nima_NF
شنبه 21 اردیبهشت 1387, 14:41 عصر
اگر با کد زیر مشکل حا نشد قطعه کد خود را اینجا قرار دهید تا ببینیم که کجا اشتباه کرده اید، ضمنا subkey باید به درستی باز شده باشد:



DWORD num;

if ( RegSetValueEx(hkey,
"test",
0,
REG_DWORD,
(LPBYTE) &num,
sizeof(DWORD)))
{
// Error
}

amir_civil
شنبه 21 اردیبهشت 1387, 17:17 عصر
ممنون
مشکل حل شد
مشکل در


sizeof(DWORD))) بودلطفا توضیح میدهید که چرا اندازه DWORD رو قرار دادید و نه اندازه مقداره اون رو و چرا NUM هیچ مقداری ندادید من کد رو این جوری نوشتم کار کرد



RegSetValueEx(Key,
"Properties",
0,REG_DWORD,
(BYTE*)("1"),
sizeof(DWORD));البته این کد هم جواب داد


DWORD f=1;

RegSetValueEx(Key,
"Properties",
0,REG_DWORD,
(BYTE*)("1"),
sizeof(f));
RegCloseKey(Key);
در کل مشکل از اندازه ای که باید میدادم بهcbData
یه مشکل دیگه هم اینه که اگر من بخاهم مقدار صفر رو درج کنم (مقدار رجیستری)چه عددی رو باید قرار دهم؟
ممنون

Nima_NF
شنبه 21 اردیبهشت 1387, 21:15 عصر
پارامتر آخر اندازه داده ای است ک با توجه به نوع مقدار قرار است ذخیره شود و چون REG_DWORD انتخاب کردید یعنی یک DWORD که 4 بایتی هست حال چه عدد شما 0 باشد یا 10000
( sizeof تعداد بایت را بر می گرداند که 4 می شود)


شما خودتان به متغیر باید عدد بدهید، فقط برای مثال آن قطعه کد را نوشتم.سعی کنید از متغیر استفاده کنید و مستقیم ننویسید.
می خواهید صفر ذخیره کنید، همان num را برابر صفر قرار دهید.

amir_civil
شنبه 21 اردیبهشت 1387, 21:32 عصر
برای مقادیر زیر مقادیر مختلف میدهد


DWORD num=1;'
DWORD num='1';
DWORD num="1";
در ضمن برای کد زیر کار میکنه


(LPBYTE) &num
ولی برای این کد نه


(BYTE*)(num),
در صورتیکه این کد طبق msdn هست
اکر لطف کنید و توضیح دهید
ممنون

Nima_NF
یک شنبه 22 اردیبهشت 1387, 00:27 صبح
پارامتر یکی مانده به آخر این تابع، اشاره گری به بایت هست چرا که می تواند رشته، عدد و غیره باشد.
پس برای این پارامتر باید آدرس متغیر یا بافر را قرار داد یعنی با & برای اعداد (اگر عدد شما به جای DWORD اشاره گری به DWORD باشد دیگر & نیاز نیست)

ضمنا وقتی متغیری از نوع DWORD تعریف می کنید یعنی همان unsigned long ، پس به طور مستقیم باید عدد مقابل آن قرار دهید نه کارکتر یا رشته:



DWORD num= 1 ; // just number

معنی دو مورد دیگر این است که کد اسکی کارکتر 1 را در num ذخیره کن که اشتباه است.
اگر می خواهید رشته یا کارکتر در رجیستری ذخیره کنید نوع آن را REG_SZ در نظر بگیرید و متغیر هم از نوع رشته ای.