من ميخوام از تو vb يه مقدار از نوع dword بسازمو مقداردهي كنمش. ولي هر مقداري ميدم تو رجيستري مينويسه invalid dword value حالا چه طور بايد بهش مقدار بدم كه invalid نشه؟
Printable View
من ميخوام از تو vb يه مقدار از نوع dword بسازمو مقداردهي كنمش. ولي هر مقداري ميدم تو رجيستري مينويسه invalid dword value حالا چه طور بايد بهش مقدار بدم كه invalid نشه؟
جوابو گير اوردم. بايد با يه متغير از نوع long مقدار بديم.
جواب كامل تر.
مشكلم رو هفته پيش حل كردم. گفتم اينجام راه حلشو بگم تا تاپيك بي جواب نمونه و اگه كسي موقع سرچ اين تاپيك رو خوند جواب بگيره.
مشكل بر ميگرده به تعريف تابع RegSetValueEx . رفتم دقيق پارامترهاي اين تابع رو بررسي كردم.تو API Text Viewer ديدم پارامتر يكي مونده به آخر يعني lpData از نوع Any تعريف شده. ميدونيد كه Any هر مقداري از هر نوعي رو ميگيره و معتبر بودن مقدار هم چك نميشه. اينه كه خيلي مواقع مثل اين مورد اشتباه پيش مياد.
من براي Value از نوع Reg_SZ بايد مقدار String ميفرستادم و براي Reg_DWORD مقدار عددي مثل Integer . اگر پارامتر lpData با Any تعريف ميشد Value هاي از نوع Reg_SZ درست مقدار دهي نميشدن. براي همين مجبور شدم دو بار تابع رو تعريف كنم .
يك بار lpData رو از نوع String
و يك بار هم از نوع Integer تعريف كردم. البته lpData همون Any هم باشه با مقادير عددي مشكلي نداره و كار درست پيش ميره.کد: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 رو از نوع String تعريف كرده اين پارامتر ByVal تعريف شده ولي در تابع دوم ByVal براي اين پارامتر وجود ندارد.کد: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 هست Public هست و هر جا RegSetValueEx صدا زده بشه lpData از نوع String خواهد بود.(به جز ماژولي كه اون يكي تابع RegSetValueEx توش تعريف شده). اون تابعي هم كه lpData از نوع Integer هست تو يه ماژول ديگه هست و Private هست. من تو اين ماژول يه تابع Public نوشتم كه Value از نوع Reg_DWORD ايجاد ميكنه و چون تابع RegSetValueEx كه در اين ماژوله براي تابعي كه من نوشتم محلي حساب ميشه از همين تابع محلي كه Private هست استفاده ميكنه نه اوني كه Public هست. همان طور هم كه گفتم lpData در اين تابع محلي از نوع Integer هست پس ميتونه به Value از نوع Reg_DWORD مقدار بده و چون تابعي كه من نوشتم Public هست تو كل برنامه ميشه صداش زد تا Value از نوع Reg_DWORD ايجاد كنه.
به همين سادگي مشكل حل شد.