srilekhamenon Ответов: 2

Проблема с реестром при чтении данных из реестра


iam портирование программного обеспечения c++ на c#
я читаю раздел реестра на c++ мой код таков

if(::RegOpenKeyEx(hParentKey, (LPCTSTR) strKeyName2,NULL,KEY_READ  , &hKey)==ERROR_SUCCESS)
{
	lRet = RegQueryValueEx(hKey, key, NULL, &type,(LPBYTE)data,&dataLen); 
}

in c# my code is  

я получаю разные выходные данные из кода c# при чтении двоичных данных из реестра
как я могу решить эту проблему ?

Что я уже пробовал:

public static readonly UIntPtr HKEY_CURRENT_USER = (UIntPtr)0x80000001;
        
        public const string lpSubKey = "Software\\Scooter Software\\Beyond Compare 3";

        public const int KEY_QUERY_VALUE = 0x1;
        [DllImport("advapi32.dll", EntryPoint = "RegOpenKeyEx")]
        public static extern int RegOpenKeyEx(UIntPtr hKey, string lpSubKey, uint ulOptions, int samDesired, out UIntPtr phkResult);

        [DllImport("advapi32.dll", EntryPoint = "RegQueryValueEx", CharSet = CharSet.Auto)]
        public static extern int RegQueryValueEx(UIntPtr hKey, string lpValueName, int lpReserved, out uint lpType, StringBuilder lpData, ref int lpcbData);

        UIntPtr hKeyVal;
        int valueRet;
        uint lpType;

StringBuilder sb = new StringBuilder(1000);
            int lpcbData = sb.Capacity;
            //string sb = string.Empty;CacheID

            valueRet = RegOpenKeyEx(HKEY_CURRENT_USER, lpSubKey, 0, KEY_QUERY_VALUE, out hKeyVal);


            valueRet = RegQueryValueEx(hKeyVal, "CacheID", 0, out lpType, sb, ref lpcbData);

            //string str = Encoding.Default.GetString(new byte[]())
            MessageBox.Show(string.Format("data type :{0}\n,data size :{1}\n,data :{2}\n", lpType.ToString(), lpcbData.ToString(), sb.ToString()), "Value", MessageBoxButtons.OK);

2 Ответов

Рейтинг:
17

Richard MacCutchan

Используйте Класс Реестра (Microsoft. Win32)[^].


Рейтинг:
0

Dave Kreskowiak

Не знаю, почему вы отвергли Ричарда. Его ответ был совершенно справедлив.

Вместо того чтобы пытаться перейти к переводу один-к-одному, просто перепишите код с помощью .Чистые классы. Вы будете писать гораздо меньше кода, делать то же самое и получите бонус лучшей обработки исключений сверх проблемы того, что вы делаете, которая просто игнорирует все коды возврата и, следовательно, любые ошибки.