2

我在这里遗漏了一些明显的东西。我正在使用 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 示例。

4

1 回答 1

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 相同的更新

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

于 2015-07-05T13:04:49.727 回答