Открытие общих файлов с помощью system() в DJGPP C

Я здесь упускаю что-то очевидное. Я использую компилятор C DJGPP. Я могу успешно открывать исполняемые файлы, но не файлы в их программах по умолчанию.

#include <stdio.h>

int main(void) {
    char sys_cmd[100] = "C:\\WINDOWS\\system32\\Calc.exe";
    system(sys_cmd);

    system("\"C:\\TextFile.txt\"");

    system("\"www.bbc.co.uk\"");
    getch();

    return 0;
}

Запуск этого кода вызывает запуск калькулятора. После закрытия калькулятора он сообщает:

Bad command of file name   
Bad command of file name    

Таким образом, существует проблема с двумя другими системными вызовами. Я попытался добавить "START " к системному вызову, но это не исправляет. Только что проверил мою систему Windows 7 Pro, у нее нет START.EXE. Добавление "cmd.exe " просто запускает cmd, поэтому все аргументы не передаются.

Я могу набрать "C:\TextFile.txt" в cmd, и он откроет notepad.exe с открытым TextFile.txt внутри.

В идеале я бы использовал для этого что-то более безопасное, чем system(), но я не видел примеров ShellExecute в DJGPP.

1 ответ

Решение

Вы не найдете ShellExecute в djgpp, потому что он только для DOS и не создает реальных приложений Windows и, следовательно, не имеет доступа к вызову Windows Api.

ShellExecute сможет использовать реестр Windows, чтобы выяснить, какое приложение нужно использовать для открытия определенного расширения файла.

Я не знаю, сможет ли exec() сделать это, но у меня есть сомнения.

Для очень старых версий существовал кросс-компилятор, позволяющий вызывать windows api из скомпилированных программ djgpp. Но так как это было основано на версии 2.9 компилятора: http://www.delorie.com/djgpp/v2faq/faq3_6.html это можно считать тупиком.

Как описано в комментарии ниже, вы можете вставить статическое отображение из.txt в блокнот. Если вам нужно поддерживать много расширений, у вас есть два варианта:

  • переключить компилятор на компилятор, который поддерживает Windows API (кроме Visual Studio есть другие)
  • выполните ftype и assoc, чтобы выяснить, какое расширение соответствует какой программе и сохранить ваш DOS-компилятор

Обратите внимание, что djgpp довольно устарел и не получает те же обновления, что и Gcc.

"Хаком" будет создание временного.cmd или.bat из вашей программы на C и делегирование запуска файла, который вам нужен, для этого пакета.

Другие вопросы по тегам