PDA

View Full Version : سوال: خواندن مقادیر REG_NONE از ریجستری



jamesband007
جمعه 11 دی 1388, 19:52 عصر
سلام
می خواستم طریقه ی خواندن مقادیر ریجستری از نوع REG_NONE رو در C#.net 2005 بدونم (نوشتن رو هم که بگید ، فبها)
این رو هم بگم که متد GetValue از کلاس RegistryKey قادر به خواندن این نوع از مقادیر نیست .

اگه با API یا P-invoke بدستش میارید ، لطفا برنامه رو بفرستید .

برای مثال اگر برنامه Internet Download Manager رو نصب کرده باشید در شاخه ی :
HKEY_CURRENT_USER/Software/DownloadManager/ListSettings
از این نوع مقادیر وجود دارد .

ممنون از محبتی که می کنید .

mehdi.mousavi
شنبه 12 دی 1388, 13:02 عصر
سلام می خواستم طریقه ی خواندن مقادیر ریجستری از نوع REG_NONE رو در C#‎‎.net 2005 بدونم (نوشتن رو هم که بگید ، فبها) این رو هم بگم که متد GetValue از کلاس RegistryKey قادر به خواندن این نوع از مقادیر نیست . اگه با API یا P-invoke بدستش میارید ، لطفا برنامه رو بفرستید.


سلام.
من نمیدونم این درخواست عجیب و غریب برای چه کاری هستش، اما مطمئن بشید که واقعا این کاری که میخواهید انجام بدید، صحیح هستش. چون واقعا REG_NONE کاربرد نداره، یا ندرتا استفاده میشه. قرار بود مایکروسافت تو نسخه 3.0 Framework پشتیبانی از REG_NONE رو اضافه کنه، که خوب، این کارو نکرد. در هر حال، بکمک این کد میتونید مقادیر REG_NONE رو بخونید. MyName اسم کلیدی هست که type اش REG_NONE هستش. لطفا به Unicode/ANSI بودن (و Comment هایی که گذاشتم) توجه کنید:

public class MyClass
{
[DllImport("advapi32.dll", SetLastError = true)]
public static extern int RegCloseKey(UIntPtr hKey);

[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
public static extern int RegOpenKeyEx(UIntPtr hKey, string subKey, int ulOptions, int samDesired, out UIntPtr hkResult);

[DllImport("advapi32.dll", CharSet = CharSet.Ansi, EntryPoint = "RegQueryValueExA", SetLastError = true)]
static extern int RegQueryValueEx(UIntPtr hKey, string lpValueName, int lpReserved, out uint lpType, System.Text.StringBuilder lpData, ref uint lpcbData);

//If you prefer the Unicode version, uncomment the following lines...
//[DllImport("advapi32.dll", CharSet = CharSet.Unicode, EntryPoint = "RegQueryValueExW", SetLastError = true)]
//static extern int RegQueryValueEx(UIntPtr hKey, string lpValueName, int lpReserved, out uint lpType, System.Text.StringBuilder lpData, ref uint lpcbData);

public void ReadRegValue()
{
UIntPtr hKey = UIntPtr.Zero;
if (RegOpenKeyEx(/*HKEY_LOCAL_MACHINE*/new UIntPtr(0x80000002u), null, 0, /*KEY_READ*/0x00020019, out hKey) == 0)
{
uint size = 1024;
uint type;
string keyValue = null;
StringBuilder keyBuffer = new StringBuilder();

if (RegQueryValueEx(hKey, "MyName", 0, out type, keyBuffer, ref size) == 0)
{
keyValue = keyBuffer.ToString();
//Do whatever suits you...
}

RegCloseKey(hKey);
}
}


ضمنا، من برای سریعتر نوشتن کد، Const ها رو جداگانه تعریف نکردم و فقط comment گذاشتم. شما باید توی production-code حتما const ها رو جداگانه و مرتب تعریف کنید.

موفق باشید.