Открытие общих файлов с помощью 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 и делегирование запуска файла, который вам нужен, для этого пакета.