PDA

View Full Version : حرفه ای: مشکل نوشتن مقدار باینری در ریجستری



M.T.P
چهارشنبه 22 دی 1389, 11:07 صبح
دوستان ارجمند یک نگاه به کد زیر بندازید:


Dim ValueName As String
Dim ValueData As String
Dim ValueType As String
Dim WSHShell As Object
Set WSHShell = CreateObject("WScript.Shell")

ValueName = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro l\Keyboard Layout\Scancode Map"
ValueData = "00 00 00 00 00 00 00 00 03 00 00 00 00 00 5B E0 00 00 5C E0 00 00 00 00"
ValueType = "REG_BINARY"

WSHShell.regwrite ValueName, ValueData, ValueType
کد بالا قراره یک مقدار از نوع باینری در مسیر ذکر شده در ریجستری بنویسه.
کد درسته اما دیتای من یعنی ValueData از نوع رشته ای هست نه باینری!:افسرده:
چطور ValueData رو از نوع آرایه با مقدار بالا پر کنیم که شیء WSHShell بتونه اون رو تو ریجستری بنویسه.
با تشکر. :قلب:

M.T.P
چهارشنبه 22 دی 1389, 15:03 عصر
دوستان تابعی دارند که این مقدار باینری رو به Hex تبدیل کنه؟

00 00 00 00 00 00 00 00 03 00 00 00 00 00 5B E0 00 00 5C E0 00 00 00 00

ali.rezaei7
چهارشنبه 22 دی 1389, 15:54 عصر
درود. دوست عزيز. اگه نوع داده در تابع regwrite روي REG_BINARY انتخاب شه، اونوقت ValueData بايد يه مقداري در بازه Integer باشه. بخاطر همين شما نمي تونيد مقدار به اين بزرگي به رجيستري انتقال بدي.


دوستان تابعی دارند که این مقدار باینری رو به Hex تبدیل کنه؟

00 00 00 00 00 00 00 00 03 00 00 00 00 00 5B E0 00 00 5C E0 00 00 00 00

اين كه خودش هگزا هست.

M.T.P
چهارشنبه 22 دی 1389, 17:44 عصر
درود. دوست عزيز. اگه نوع داده در تابع regwrite روي REG_BINARY انتخاب شه، اونوقت ValueData بايد يه مقداري در بازه Integer باشه. بخاطر همين شما نمي تونيد مقدار به اين بزرگي به رجيستري انتقال بدي.
ممنون از پاسختون. اما راه حل چیه؟ :متفکر:

ali.rezaei7
چهارشنبه 22 دی 1389, 18:36 عصر
دوست من شما مي تونيد از WMI Registry استفاده كنيد.

اين دستوري كه برات آماده كردم داده باينري رو ثبت مي كنه:


Dim obj As Object
Dim b(5) As Byte
b(0) = &HFD
b(1) = &HC
b(2) = &HF
b(3) = &HCD
b(4) = &HD
b(5) = &HCC

Set obj = CreateObject("winmgmts:{impersonationLevel=impersonate}!\\.\root \default:StdRegProv")
obj.SetBinaryValue HKEY_LOCAL_MACHINE, "Software", "bin", b
اين دستور مقدار باينري، با نام bin رو داخل پوشه Software ايجاد مي كنه و مقادير آرايه b رو داخل اون قرار مي ده.

Const HKEY_LOCAL_MACHINE = &H80000002

M.T.P
چهارشنبه 22 دی 1389, 19:00 عصر
از لطف شما سپاسگزارم.
راهکاری عملی و بسیار عالی...
کد رو به شکل زیر تغییر دادم درست شد:


Const HKEY_LOCAL_MACHINE = &H80000002
Dim obj As Object
Dim b(0 To 23) As Byte
b(0) = 0: b(1) = 0: b(2) = 0: b(3) = 0: b(4) = 0: b(5) = 0: b(6) = 0: b(7) = 0
b(8) = 3: b(9) = 0: b(10) = 0: b(11) = 0: b(12) = 0: b(13) = 0: b(14) = &H5B: b(15) = &HE0
b(16) = 0: b(17) = 0: b(18) = &H5C: b(19) = &HE0: b(20) = 0: b(21) = 0: b(22) = 0: b(23) = 0
Set obj = CreateObject("winmgmts:{impersonationLevel=impersonate}!\\.\root \default:StdRegProv")
obj.SetBinaryValue HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Control\Keyboard Layout", "Scancode Map", b


اما چرا WSHShell.regwrite نمیتونه این نوع آرایه رو قبول کنه...!

ali.rezaei7
چهارشنبه 22 دی 1389, 19:13 عصر
تابع regwrite از آرايه پشتيباني نمي كنه. و به همين دليل هست كه وقتي آرايه اي به اين تابع داده مي شود. برنامه دچار خطاي در حال اجراي Type Mismatch مي شود.