none
RegOpenKeyExA выдает ошибку: идентификатор не найден RRS feed

  • Вопрос

  • Использую эту функцию в консольном приложении, все ок, если использую в оконном приложении появляется ошибка: идентификатор не найден.

    char * getProcessorName() {
    HKEY hkey = nullptr;
    LRESULT err = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0, KEY_READ, &hkey);
    if (!err) {
    char identifier[400] = {};
    DWORD identifier_len = sizeof identifier;
    DWORD dw_type = 0;
    err = RegQueryValueExA(hkey, "ProcessorNameString", nullptr, &dw_type, (BYTE*)identifier, &identifier_len);
    if ((err) || (dw_type != REG_SZ))
    {
    }
    return identifier;
    }
    return "";
    }



    • Изменено SergeySolo 15 декабря 2017 г. 7:54
    14 декабря 2017 г. 20:26

Ответы

  • На C#, конечно. В общем то все можно на нем писать, особенно "сложные задачи со сложным кодом" так как код становиться куда менее сложным и пишется быстрее. Конечно, есть и исключения но их немного.

    Если есть наследственные исходники на C++, то их компилить в DLL и цеплять к приложению через P/Invoke. Если старых исходников немного то лучше выполнить порт на C#. 


    This posting is provided "AS IS" with no warranties, and confers no rights.

    15 декабря 2017 г. 22:12
    Модератор

Все ответы

  • 1. Замените все char на WCHAR.

    2. Замените все *A на *W.

    3. Все строки должны иметь префикс L (L"Строка на совершенно любых языках")



    This posting is provided "AS IS" with no warranties, and confers no rights.

    14 декабря 2017 г. 23:10
    Модератор
  • 1. Замените все char на WCHAR.

    2. Замените все *A на *W.

    3. Все строки должны иметь префикс L (L"Строка на совершенно любых языках")



    This posting is provided "AS IS" with no warranties, and confers no rights.

    не помогло

    • Изменено SergeySolo 15 декабря 2017 г. 8:17
    15 декабря 2017 г. 8:16
  • Мы же не знаем, чем у вас оконное приложение отличается от консольного. Может вы просто в нем не включили <windows.h>. С вашим кодом проблем нет, приведите чуть больше контекста, что за проект и т.п.
    15 декабря 2017 г. 10:00
  • Мы же не знаем, чем у вас оконное приложение отличается от консольного. Может вы просто в нем не включили <windows.h>. С вашим кодом проблем нет, приведите чуть больше контекста, что за проект и т.п.

    Почти ничем не отличается, вот весь код

    //
    // MainPage.xaml.cpp
    // Реализация класса MainPage.
    //

    #include "pch.h"
    #include "MainPage.xaml.h"
    #include "include/infoware/cpu.hpp"
    #include <utility>
    #include <codecvt>
    #include <windows.h>

    using namespace minbit;

    using namespace Platform;
    using namespace Windows::Foundation;
    using namespace Windows::Foundation::Collections;
    using namespace Windows::UI::Xaml;
    using namespace Windows::UI::Xaml::Controls;
    using namespace Windows::UI::Xaml::Controls::Primitives;
    using namespace Windows::UI::Xaml::Data;
    using namespace Windows::UI::Xaml::Input;
    using namespace Windows::UI::Xaml::Media;
    using namespace Windows::UI::Xaml::Navigation;
    // Документацию по шаблону элемента "Пустая страница" см. по адресу https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x419

    MainPage::MainPage()
    {
    InitializeComponent();
    }


    char * getProcessorName() {
    HKEY hkey = nullptr;
    LRESULT err = RegOpenKeyExW(HKEY_LOCAL_MACHINE, (LPSTR)"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0, KEY_READ, &hkey);
    if (!err) {
    char identifier[400] = {};
    DWORD identifier_len = sizeof identifier;
    DWORD dw_type = 0;
    err = RegQueryValueExW(hkey, "ProcessorNameString", nullptr, &dw_type, (BYTE*)identifier, &identifier_len);
    if ((err) || (dw_type != REG_SZ))
    {
    }
    return identifier;
    }
    return "";
    }

    вот скрин ошибки, вообще не понятно, в консоле работает на ура, то есть выводит название проца, а тут такая ошибка http://prntscr.com/hntwna 

    ссылку не получилось вставить, нужно акк подтвердить.

    • Изменено SergeySolo 15 декабря 2017 г. 11:13
    15 декабря 2017 г. 11:12
  • > Почти ничем не отличается, вот весь код

    > MainPage.xaml.cpp

    Please... 

    Это проект UWP? В проектах UWP функции работы с реестром недоступны.

    15 декабря 2017 г. 15:06
  • Если вы используйте UWP, то очень много чего недоступно. В следующий раз заходите прямиком на MSDN и смотрите поддерживается ли конкретная платформа.

    Например для данной функции:

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms724897%28v=vs.85%29.aspx

    И в конце страницы видим:

    Minimum supported client

    Windows 2000 Professional [desktop apps only]

    [desktop apps only] означает то что в UWP она недоступна.

    Пример доступной функции:

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms679360(v=vs.85).aspx

    Minimum supported client

    Windows XP [desktop apps | UWP apps]


    В любом случае использовать 8 битные строки не следует. Во всем мире программисты это давно осознали, а вот в РФ - нет. А, казалось бы, для РФ это особенно важно из кириллицы, но нет. Ну а потом наступает героическая борьба с "иероглифами", "квадратиками" и "знаками вопроса".


    This posting is provided "AS IS" with no warranties, and confers no rights.

    15 декабря 2017 г. 17:07
    Модератор
  • > Почти ничем не отличается, вот весь код

    > MainPage.xaml.cpp

    Please... 

    Это проект UWP? В проектах UWP функции работы с реестром недоступны.

    как это обойти? Очень нужно
    15 декабря 2017 г. 18:36
  • Если вы используйте UWP, то очень много чего недоступно. В следующий раз заходите прямиком на MSDN и смотрите поддерживается ли конкретная платформа.

    Например для данной функции:

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms724897%28v=vs.85%29.aspx

    И в конце страницы видим:

    Minimum supported client

    Windows 2000 Professional [desktop apps only]

    [desktop apps only] означает то что в UWP она недоступна.

    Пример доступной функции:

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms679360(v=vs.85).aspx

    Minimum supported client

    Windows XP [desktop apps | UWP apps]


    В любом случае использовать 8 битные строки не следует. Во всем мире программисты это давно осознали, а вот в РФ - нет. А, казалось бы, для РФ это особенно важно из кириллицы, но нет. Ну а потом наступает героическая борьба с "иероглифами", "квадратиками" и "знаками вопроса".


    This posting is provided "AS IS" with no warranties, and confers no rights.

    Скажите без UWP можно делать оконное приложение? Как это делать возможно на QT? Если из эти функций собрать библиотек lib, может так получится?
    15 декабря 2017 г. 18:39
  • "как это обойти? Очень нужно"

    Никак (кроме создания отдельного веб-сервиса, который будет скармливать приложению эти данные). Приложению, которому нужна информация о процессоре, в UWP явно делать нечего. 

    15 декабря 2017 г. 19:29
  • "как это обойти? Очень нужно"

    Никак (кроме создания отдельного веб-сервиса, который будет скармливать приложению эти данные). Приложению, которому нужна информация о процессоре, в UWP явно делать нечего. 

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

    Вариантов тут два:

    - Не использовать UWP, а использовать приложение для десктопа. Проще всего писать на C#/WPF, но если у вас много свободного времени то разумеется можно сделать оконное приложение и на C++. Поиск: "C++ show window" легко находит пример который показывает пустое окно. Ну а дальше добавляйте что вам надо. 

    - Найти API который доступен в UWP и делает то что вам надо (если таковой имеется).


    This posting is provided "AS IS" with no warranties, and confers no rights.

    15 декабря 2017 г. 21:40
    Модератор

  • - Не использовать UWP, а использовать приложение для десктопа. Проще всего писать на C#/WPF, но если у вас много свободного времени то разумеется можно сделать оконное приложение и на C++. Поиск: "C++ show window" легко находит пример который показывает пустое окно. Ну а дальше добавляйте что вам надо. 

    вот это вариант подробнее, на чем лучше писать? предпочтительно с++ потому как приложение будет выполнять сложные задачи со сложным кодом, и исходники уже есть на с++, хотя можно и с#, думаю смогу подружить то что есть с с#.
    15 декабря 2017 г. 22:02
  • На C#, конечно. В общем то все можно на нем писать, особенно "сложные задачи со сложным кодом" так как код становиться куда менее сложным и пишется быстрее. Конечно, есть и исключения но их немного.

    Если есть наследственные исходники на C++, то их компилить в DLL и цеплять к приложению через P/Invoke. Если старых исходников немного то лучше выполнить порт на C#. 


    This posting is provided "AS IS" with no warranties, and confers no rights.

    15 декабря 2017 г. 22:12
    Модератор
  • На C#, конечно. В общем то все можно на нем писать, особенно "сложные задачи со сложным кодом" так как код становиться куда менее сложным и пишется быстрее. Конечно, есть и исключения но их немного.

    Если есть наследственные исходники на C++, то их компилить в DLL и цеплять к приложению через P/Invoke. Если старых исходников немного то лучше выполнить порт на C#. 


    This posting is provided "AS IS" with no warranties, and confers no rights.

    Спасибо за советы, +5 в карму.
    15 декабря 2017 г. 23:21
  • В UWP есть класс DeviceInformation, возможно из него удастся что-то вытянуть. Судя по всему, это урезанная обертка над Setup API.

    Если будете на C# писать (традиционное настольное приложение), информацию об оборудовании лучше брать через WMI (System.Management), а не напрямую из реестра. Вообще, и на С++ нежелательно сильно зависеть от структуры реестра, так как она может измениться в новых версиях ОС. Лучше использовать, в зависимости от ситуации, либо Setup API, либо напрямую данные таблицы SMBIOS , либо тот же WMI.

    16 декабря 2017 г. 10:02