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

时间:2015-07-05 12:34:24

标签: c system djgpp

我在这里遗漏了一些明显的东西。我正在使用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,所以好像没有发送任何参数。

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

  • 将编译器切换到支持windows api的编译器(除了其他人之外还有visual studio)
  • 执行ftype和assoc以找出哪个扩展名映射到哪个程序并保留dos编译器

请注意,djgpp已经过时,并且没有收到Gcc所做的相同更新

A&#34; hack&#34;将是从您的C程序创建一个临时的.cmd或.bat并委派您需要该批文件的文件的启动。