在 DJGPP C 中使用 system() 打开通用文件

Opening generic files with system() in DJGPP C

我在这里遗漏了一些明显的东西。我正在使用 DJGPP C 编译器。我可以成功打开可执行文件,但不能打开其默认程序中的文件。

#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,所以就好像没有发送任何参数一样。

我可以在cmd中正常输入"C:\TextFile.txt",它会打开notepad.exe,里面打开了TextFile.txt。

理想情况下,无论如何我都会使用比 system() 更安全的方法来执行此操作,但我还没有在 DJGPP 中看到任何 ShellExecute 示例。

您不会在 djgpp 中找到 ShellExecute,因为它只是 DOS,不会创建真正的 Windows 应用程序,因此无法访问 windows Api 调用。

ShellExecute 将能够使用 Windows 注册表找出打开特定文件扩展名需要使用哪个应用程序。

我不知道 exec() 是否能够做到这一点,但我有疑问。

对于非常旧的版本,存在允许从 djgpp 编译程序调用 windows api 的交叉编译器。但由于这是基于 2.9 版本的编译器:http://www.delorie.com/djgpp/v2faq/faq3_6.html 这可以被认为是一个死胡同。

如以下评论中所述,您可以插入从 .txt 到记事本的静态映射。如果你必须支持很多扩展,你基本上有两个选择:

  • 将编译器切换为支持windowsapi的编译器(除此之外还有visual studio)
  • 执行 ftype 和 assoc 找出哪个扩展映射到哪个程序并保留你的 dos 编译器

请注意,djgpp 已经过时并且不会收到与 Gcc 相同的更新

A "hack" 是从您的 C 程序创建一个临时的 .cmd 或 .bat 并将您需要的文件的开始委托给该批处理。