PDA

View Full Version : مشکل ست کردن value در رجیستری



Payman62
یک شنبه 30 بهمن 1384, 03:35 صبح
سلام.
من با دستور RegSetValueExA تو یه کلید value از نوع reg_dword ایجاد میکنم. ولی هر مقداری که موقع ساخت بهش میدم وقتی تو رجیستری میرم میبینم زده invalid dword value
چه کار کنم که از value بگیره

حامد مصافی
دوشنبه 01 اسفند 1384, 00:11 صبح
قبل از طرح سوال یه جستجو بکنید
بار ها و بار ها پاسخ داده شده

Payman62
سه شنبه 02 اسفند 1384, 05:25 صبح
blackdal عزیز من سرچ کرده بودم. 3 صفحه هم لیست تاپیک پیدا کردم. ولی جواب سوالم توشون نبود. چون سوالم از اون مشکلاتیه که برای کمتر کسی پیش میاد. حالا ممنون میشم راهنماییم کنید.
یه سوالم از شما داشتم جناب blackdAL در مورد برنامه راهنمای api هاتون. آپدیت نشده؟ آخه تعدادی از توابع رو نداره. خیلی برنامه عالیه آپدیتش کن.

حامد مصافی
سه شنبه 02 اسفند 1384, 23:50 عصر
این از رجیستری
http://www.barnamenevis.org/forum/showthread.php?t=28317

در مورد برنامه هم عرض کنم که مشغول نوشتن نسخه جدید این برنامه هستم که کاربران قادر خواهند اطلاعات خود را نه تنها در مورد API بلکه در سایز موارد برنامه نویسی در نرم افزار ذخیره کنند و با دیگران به اشتراک بذارن
البته به علت حجم کارام فکر نمی کنم به این زودی آماده بشه!!!

Payman62
چهارشنبه 03 اسفند 1384, 04:51 صبح
جناب blackdal مشکل من کار کردن با این توابع نیست. بنده به این توابع آشنایی دارم. ولی همان طور که گفتم وقتی value از نوع reg_dword ایجاد میکنم مقدار نمیگیره و تو رجیستری invalid dword value نشون میده. ماژول شما هم که تفاوتی با روش کار من نداشت ولی بازم تست کردم و همان اتفاق افتاد. من فقط یه مقدار قابل قبول برای value از نوع reg_dword میخوام.

حامد مصافی
پنج شنبه 04 اسفند 1384, 00:05 صبح
در فراخوانی تابع به جای ثابت reg_sz از ثابت reg_dword استفاده کنید

Payman62
پنج شنبه 04 اسفند 1384, 02:57 صبح
در فراخوانی تابع به جای ثابت reg_sz از ثابت reg_dword استفاده کنید
همین کارو میکنم و اون مشکل به وجود میاد. اگه reg_sz بذارم که اصلا اون error رو نمیده. هر چی بهش بدی میگیره

behzad_gh
دوشنبه 29 اسفند 1384, 09:10 صبح
سلام
REG_DWORD فقط عدد ۳۲بیتی قبول می‌کنه . آیا مقداری که می‌خواهی ست کنی یک عدد ۳۲ بیتی است ؟
این هم لیست انواع کلید‌های رجیستری و مقادیری که برای ست کردن قبول می‌کنند:

'Registration key types
Private Const REG_NONE As Long = 0 'No value type
Private Const REG_SZ As Long = 1 'Unicode null terminated string
Private Const REG_EXPAND_SZ As Long = 2 'Unicode null terminated string
Private Const REG_BINARY As Long = 3 'Free form binary
Private Const REG_DWORD As Long = 4 '32-bit number
Private Const REG_DWORD_LITTLE_ENDIAN As Long = 4 '32-bit number (same as REG_DWORD)
Private Const REG_DWORD_BIG_ENDIAN As Long = 5 '32-bit number
Private Const REG_LINK As Long = 6 'Symbolic Link (Unicode)
Private Const REG_MULTI_SZ As Long = 7 'Multiple Unicode strings
Private Const REG_RESOURCE_LIST As Long = 8 'Resource list in the resource map
Private Const REG_FULL_RESOURCE_DESCRIPTOR As Long = 9 'Resource list in the hardware description
Private Const REG_RESOURCE_REQUIREMENTS_LIST As Long = 10

Payman62
دوشنبه 29 اسفند 1384, 16:53 عصر
آخه این API فقط استرینگ به عنوان مقدار میگیره.
Public Declare Function RegSetValueExA Lib "advapi32" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
lpData مقداریه که ست میشه واسه اون value چه طور بهش عدد 32 بیتی بدم.

behzad_gh
دوشنبه 29 اسفند 1384, 17:27 عصر
شما باید قبل از اینکه اطلاعات رو به رجیستری بدی اون رو چک کنی که برای نوع REG_DWORD از کد زیر می‌تونی استفاده کنی .
If (VarType(vValue) = vbInteger) Or (VarType(vValue) = vbLong) Then
Dim i As Long
i = vValue
e = RegSetValueExLong(hKey, m_sValueKey, 0&, REG_DWORD, i, 4)
End If

Payman62
دوشنبه 29 اسفند 1384, 18:08 عصر
آقا خیلی ممنونم ازت. بعد از بیشتر از یه ماه مشکلم حل شد. چون تو تعریف تابع متغیری که مقدار میداد استرینگ تعریف شده بود من هم لانگ نمیدادم و استرینگ میدادم و واسه همین invalid میشد.
ولی من میخوام value این مقدار رو بگیره. (0x00000000 (1 چه عددی بدم که اینو بگیره.

behzad_gh
دوشنبه 29 اسفند 1384, 19:38 عصر
برای ست کردن 0

e = RegSetValueExLong(hKey, m_sValueKey, 0&, REG_DWORD,0&, 4)

برای ست کردن 1


e = RegSetValueExLong(hKey, m_sValueKey, 0&, REG_DWORD,1&, 4)

Payman62
دوشنبه 29 اسفند 1384, 20:28 عصر
منظور از RegSetValueExLong همین RegSetValueExA هست دیگه؟
ولی اشتباست. مقدار 0 و 1 نمیگیره. خودت چک کن.

behzad_gh
دوشنبه 29 اسفند 1384, 20:44 عصر
من الان کد زیر رو امتحان کردم مقدار صیحیح داخل رجیستری ریخت :

'This program needs 3 buttons
Const REG_SZ = 1
Const REG_DWORD = 4
Const HKEY_CURRENT_USER = &H80000001
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long

Private Sub Form_Load()
Dim Ret
'Create a new key
RegCreateKey HKEY_CURRENT_USER, "Key", Ret
'Set the key's value
RegSetValueEx Ret, "KeyValue", 0, REG_DWORD, 1&, 4
'close the key
RegCloseKey Ret
End Sub

Payman62
دوشنبه 29 اسفند 1384, 20:57 عصر
آره درسته. منم از همین دستورات استفاده کردم ولی 1 نریخت. برم اشکالشو پیدا کنم.

Payman62
سه شنبه 01 فروردین 1385, 00:56 صبح
بعد از کلی کشمکش فهمیدم که شما تو تعریف تابع از Alias که فقط برای ساده کردن اسم تابع هست و قاعدتا نباید تاثیری تو عملکرد تابع داشته باشه استفاده کردی ولی من از Alias استفاده نکرده بودم و این مساله باعث میشد تا value مقداری غیر از 1 بگیره. یعنی Alias رو عملکرد تابع تاثیر گذاشته بود. تازه جالبتر اینکه وقتی منم از Alias تو تعریف تابعم استفاده کردم value های استرینگم موقع مقدار گرفتن یه چیزی شبیه عبارات encrypt شده گرفته بودن. یه چیزی شبیه عبارات کد شده. میبینین دوستان همه مشکل دارن ما هم مشکل داریم. کارمون سر استفاده نکردن از Alias هم گیر میکنه.
برم ببینم چه کار میشه کردش.
اینم بگم وجود یا عدم وجود Alias رو کد شما تاثیر گذار نبود.

Payman62
جمعه 11 فروردین 1385, 02:34 صبح
مشکلم رو هفته پیش حل کردم. گفتم اینجام راه حلشو بگم تا تاپیک بی جواب نمونه و اگه کسی موقع سرچ این تاپیک رو خوند جواب بگیره.
مشکل بر میگرده به تعریف تابع RegSetValueEx . این که گفته بودم به خاطر وجود Alias هست اشتباه بود. خود منم اینکه Alias تو کارکرد تابع تاثیر گذار باشه برام عجیب بود. این بود که رفتم و دقیق پارامترهای این تابع رو بررسی کردم.تو API Text Viewer دیدم پارامتر یکی مونده به آخر یعنی lpData از نوع Any تعریف شده. میدونید که Any هر مقداری از هر نوعی رو میگیره و معتبر بودن مقدار هم چک نمیشه. اینه که خیلی مواقع مثل این مورد اشتباه پیش میاد.
من برای Value از نوع Reg_SZ باید مقدار String میفرستادم و برای Reg_DWORD مقدار عددی مثل Integer . اگر پارامتر lpData با Any تعریف میشد Value های از نوع Reg_SZ درست مقدار دهی نمیشدن. برای همین مجبور شدم دو بار تابع رو تعریف کنم .
یک بار lpData رو از نوع String

Public Declare Function RegSetValueExA Lib "advapi32" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
و یک بار هم از نوع Integer تعریف کردم. البته lpData همون Any هم باشه با مقادیر عددی مشکلی نداره و کار درست پیش میره.

Private Declare Function RegSetValueExA Lib "advapi32" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Integer, ByVal cbData As Long) As Long
توجه کنید در تابع اول که lpData رو از نوع String تعریف کرده این پارامتر ByVal تعریف شده ولی در تابع دوم ByVal برای این پارامتر وجود ندارد.
اون تابعی که lpData در آن از نوع String هست Public هست و هر جا RegSetValueEx صدا زده بشه lpData از نوع String خواهد بود.(به جز ماژولی که اون یکی تابع RegSetValueEx توش تعریف شده). اون تابعی هم که lpData از نوع Integer هست تو یه ماژول دیگه هست و Private هست. من تو این ماژول یه تابع Public نوشتم که Value از نوع Reg_DWORD ایجاد میکنه و چون تابع RegSetValueEx که در این ماژوله برای تابعی که من نوشتم محلی حساب میشه از همین تابع محلی که Private هست استفاده میکنه نه اونی که Public هست. همان طور هم که گفتم lpData در این تابع محلی از نوع Integer هست پس میتونه به Value از نوع Reg_DWORD مقدار بده و چون تابعی که من نوشتم Public هست تو کل برنامه میشه صداش زد تا Value از نوع Reg_DWORD ایجاد کنه.
به همین سادگی مشکل حل شد.

apanahi
شنبه 04 آذر 1385, 22:26 عصر
با سلام
من مطالب شما را خواندم ولی هنوز برنامه خطا می دهد برنامه در VB.Net 2005 نوشته شده با سورس زیر:
Public Class Form1
Dim strReg As String = "[HKEY_LOCAL_MACHINE\SOFTWARE\Bazi\User]"
Private Const REG_SZ = 1
Private Const REG_DWORD = 4
Private Const REG_BINARY = 3
Private Const REG_EXPAND_SZ = 2
Private Const REG_MULTI_SZ = 7
Private Const ERROR_NO_MORE_ITEMS = 259&
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const KEY_ALL_ACCESS = &HF003F
Dim hKey As Long
Private Structure REG_VALUE
Dim vType As Long
Dim vSize As Long
Dim vData As Object
End Structure

'تعریف توابع
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long 'درست کردن مقدار و داده آن
Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, ByVal lpcbValueName As Long, ByVal lpReserved As Long, ByVal lpType As Long, ByVal lpData As String, ByVal lpcbData As Long) As Long 'خواندن مقدار و داده آن
Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long 'حذف مقدار از رجیستری
Private Declare Function RegCloseKey Lib "advapi32.dll" Alias "RegCloseKey" (ByVal hKey As Long) As Long 'بستن رجیستری
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, ByVal phkResult As Long) As Long 'باز کردن رجیستری

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim ValueData As String, ValueName As String, ValueSize As Long, ValueType As Long
RegOpenKeyEx(HKEY_LOCAL_MACHINE, strReg, 0, KEY_ALL_ACCESS, hKey)خطا از این است
ValueData = TextBox2.Text.Trim
ValueSize = 28
ValueName = TextBox1.Text.Trim
ValueType = REG_SZ
RegSetValueEx(hKey, ValueName, 0, ValueType, ValueData, ValueSize)
RegCloseKey(hKey)

End Sub
End Class
اشکال در در قسمتی است که با شکلک نشان داده شده است با این پیغام خطا:
PInvokeStackImbalance was detected
Message: A call to PInvoke function 'Registry001!Registry001.Form1::RegOpenKeyEx' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

Payman62
چهارشنبه 22 خرداد 1387, 12:06 عصر
سلام.
دست خودم درد نکنه. بعد از 2 سال دوباره به این مشکل بر خوردم. اومدم توضیحات خودم رو خوندم و مشکلم حل شد. چه کامل و واضح توضیح دادم.
گفتم تاپیک رو بیارم بالا شاید به درد دوستان جدید بخوره.