Преобразование в C ++ из C # - PullRequest
2 голосов
/ 17 мая 2011

Я выполнил почти все свое программирование с использованием C # и в значительной степени новичок в C ++. Однако сейчас мне нужно перейти на C ++, и мне это немного сложно. Например, я написал довольно простую программу, использующую C # для получения RegistryKey, затем, используя рекурсивную функцию, я перебираю свой ключ реестра, чтобы найти определенный ключ, а затем получаю нужные значения. Нет проблем, я могу написать эту программу за 10 минут, используя C #. Вот код.

Моя основная функция. Он получает ключ реестра Bluetooth и затем вызывает рекурсивную функцию.

private static void CheckOpenComPorts()
{
            RegistryKey blueToothPorts = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Enum\Bluetooth");

            List<string> foundPorts = new List<string>();
            AddFoundPortsToList(blueToothPorts, ref foundPorts);

            //Rest of the program; not relevant here.            
}

Рекурсивная функция. Итерирует переданный ключ, чтобы найти необходимые значения.

private static void AddFoundPortsToList(RegistryKey regKey, ref List<string> ports)
        {
            try
            {
                string[] subKeys = regKey.GetSubKeyNames();

                if (subKeys != null)
                {
                    foreach (string subKey in subKeys)
                    {
                        AddFoundPortsToList(regKey.OpenSubKey(subKey), ref ports);
                    }
                }

                if (regKey.Name.EndsWith("Device Parameters"))
                {
                    string str = System.Convert.ToString(regKey.GetValue("PortName"));
                    if (String.IsNullOrEmpty(str) == false)
                    {
                        ports.Add(str);
                    }
                }
            }
            catch (System.Security.SecurityException ex)
            {
                ;
            }
        }

Приведенный выше код работает нормально, но когда я попытался преобразовать его в C ++, я довольно растерялся. Примечание: я использую Win32 Console C ++ Program.

Я понял, что могу сделать что-то вроде следующего, чтобы получить ключ реестра Bluetooth.

RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Enum\\Bluetooth", 0, KEY_READ, &hKey)

Но после этого я довольно запутался в рекурсивной функции. Специально, как я могу получить доступные подразделы переданного ключа реестра , когда я НЕ знаю имена подразделов ?. Или вкратце, каково эквивалентное поведение RegistryKey.GetSubKeyNames () в C ++?

Поскольку я только начинаю, пример кода с некоторыми пояснениями был бы великолепен.

Ответы [ 3 ]

3 голосов
/ 17 мая 2011

Выполучить все подключи, вызывая RegEnumKeyEx в цикле, пока он не вернет ERROR_NO_MORE_ITEMS.

Точно так же вы получите все значения, вызвав RegEnumValue в цикле, пока он не вернет ERROR_NO_MORE_ITEMS.

1 голос
/ 17 мая 2011

Я предполагаю, что вы хотите перейти с .NET на нативное программирование на C ++. (т.е. без CLI и .NET Framework, которые вы все равно могли бы использовать, если включили управляемую компиляцию C ++).

Если вы провели кучу времени на земле C #, вы, вероятно, очень привыкли к куче очень удобных классов для всего, что только можно вообразить, и все, что вам нужно сделать, это нажать «». и позвольте Intellisense перечислить методы. Ну .... вы можете забыть все эти удобства:)

В C ++ нет такой (по крайней мере, не полной) платформы, поэтому часто приходится обращаться к Win32 API. Библиотека MSDN - ВАШ ДРУГ. Если вы хотите хорошо разбираться в C ++, научитесь читать его и узнайте, как искать вещи (не только по имени, но и по различным категориям). В этом случае, если вы ищете функцию, которую вы нашли, вы найдете целый набор функций, которые работают в реестре. Итак, теперь, глядя на другие методы в той же категории в библиотеке MSDN, вы можете найти RegEnumKeyEx . (подсказка: убедитесь, что пользовательский интерфейс библиотеки MSDN переключен на классический вид, что значительно упрощает навигацию по темам. Я не знаю, что думала MS с их «новым» внешним видом)

Когда вы начнете использовать Win32 API, вы поймете, что это за боль, особенно из-за C #. Но вам не нужно использовать его напрямую (или, по крайней мере, не каждый раз). Вы можете использовать другие библиотеки, например, ATL предоставляет класс CRegKey, который значительно упрощает работу с реестром. Если вы не можете найти класс, делайте то, что лучше всего делает C ++, напишите свой собственный класс. Постоянная работа непосредственно с функциями Windows сделает ваш код очень, очень длинным и затруднит чтение.

Еще две библиотеки, которые стоит знать при входе в C ++, - это STL (обязательно) и Boost (строго следует). В Boost особенно много абстракций ОС, поэтому вам не нужно каждый раз обращаться непосредственно к библиотекам Windows.

1 голос
/ 17 мая 2011

Если вы ищете справку по MSDN на RegOpenKeyEx, а затем переходите к содержанию, вы найдете все связанные методы: Методы реестра

Возможно, вы хотите использовать RegEnumKeyEx для перечисления подразделов.

...