Squeak.ru - шаблоны программирования

Запуск команд командной строки в собственном приложении

Есть ли способ запускать команды командной строки из приложения C? Я хочу проверить серийный номер жесткого диска производителя с помощью команды wmic diskdrive get serialnumber.

16.10.2015


Ответы:


1

Существует множество функций, которые позволяют вызывать внешнюю программу из C, некоторые из них "стандартные", некоторые из них только для Windows.

Но в вашем сценарии я бы рекомендовал вам использовать WMI API, предоставляемый Windows, вы можете найти примеры для этого уже в stackoverflow:

Как получить данные из WMI с помощью приложения C? как выполнить запрос wmi в c

Я не привел примеры, а скорее связался с уже существующими ответами на SO, потому что я не думаю, что имеет смысл копировать то, что уже есть.

16.10.2015
  • В справочнике MSDN по WMI COM Api говорится следующее: Примечание. WMI поддерживает разработку только на C ++ с использованием Microsoft Visual C ++ версии 6.0 и более поздних систем разработки. 16.10.2015
  • Пожалуйста, проверьте ссылку, указанную выше. Он показывает пример, который является простым языком C, без использования C ++. Кажется, что COM - лишь одна из альтернатив доступа к WMI. 16.10.2015

  • 2

    Вы можете попробовать использовать popen: -

    #include<stdio.h>
    #include<string.h>
    
    int main()
    {
       char c;
       FILE *file = popen("wmic diskdrive get serialnumber", "r");
       if (file) {
         while ((c = getc(file)) != EOF)
            putchar(c);
        fclose(file);
       }
       return 0;
    }
    

    Поскольку это файловый объект, теперь вы можете легко записать его в файл, если хотите, а также получить его по желанию.

    16.10.2015

    3

    Да, ты можешь. Однако это считается плохой практикой, поскольку это делает ваше приложение излишне зависимым от платформы и создает накладные расходы.

    Вот так

    #include <stdio.h>
    #include <string.h>
    void main ()
    {
        system("wmic diskdrive get serialnumber");
    }
    

    Подробнее об этом читайте здесь. Относительно вывода (цитируется по ссылке выше):

    В случае ошибки возвращается значение -1, в противном случае - статус возврата команды.

    Вы также можете использовать ReadConsoleOutputCharacter (ссылка на входящую ссылку msdn) для чтения вывода консоли.

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

    16.10.2015
  • И как получить результат? 16.10.2015
  • из ссылки, которую я связал, относительно вывода: возвращаемое значение - -1 при ошибке, а в противном случае - статус возврата команды. 16.10.2015
  • Неа. Результат wmic выглядит примерно как SerialNumber Z81EFB1 E6503403 F123123. Это не впишется в int 16.10.2015
  • Если вы пишете код для конкретной платформы, использование функций этой платформы - неплохая практика. Проверка производителя и серийного номера, вероятно, в любом случае будет зависеть от платформы, поэтому вы в значительной степени отказываетесь от полной переносимости. Но если есть способ сделать это через WinAPI (вероятно, есть), то это определенно лучше. 16.10.2015
  • Дальнейшее копание говорит, что есть WIM api, но он действительно работает только в c ++ 16.10.2015
  • Таким образом, вы, вероятно, могли бы создать dll-оболочку C ++, которая экспортирует функции для вызова ее в c, но это много работы 16.10.2015
  • Как вы ReadConsoleOutputCharacter читаете консольный вывод внешнего процесса? Думаю, это не сработает. Перенаправление стандартного вывода этого процесса вашему вызывающему процессу и последующий его анализ может быть решением. 16.10.2015
  • Ага ReadConsoleOutputCharacter склонил чашу весов. Только так важно помочь ответить на ошибочный вопрос, но послать их так далеко в лес, что они умрут от голода ужасной смертью - это просто нехорошо. -1 30.01.2016
  • WMI API выглядит как COM. Смысл COM в том, чтобы быть промежуточным продуктом. Конечно, вы можете использовать это из C. (Это будет нехорошо, но ... ну, это c ) 30.01.2016
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...