【问题标题】:Opening generic files with system() in DJGPP C在 DJGPP C 中使用 system() 打开通用文件
【发布时间】:2015-07-05 12:34:23
【问题描述】:

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

【问题讨论】:

  • 'system' 在包含的命令退出之前不会返回。因此,第二次和第三次调用system不在calc.exe的执行范围内。建议,对于系统的第二次调用,使用要编辑的文件的参数执行一个编辑器。与第三次调用系统类似

标签: c system djgpp


【解决方案1】:

你不会在 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 并将您需要的文件的启动委托给该批处理。

【讨论】:

  • 如果 OP 没有完全掌握这一点,还值得注意的是,他/她正试图像执行二进制文件一样执行文件。要实现上述目标,代码必须类似于 path_to_notepad.exe inputfile.txtpath_to_firefox.exe URL_TO_OPEN
  • @Dogbert 请注意,使用 Windows api,您可以通过这种方式“执行”文件,并且 Windows 会为您尝试执行的文件结尾启动默认程序。 (或者在 URL 的情况下,运行 URL 处理程序,尽管 OP 需要使用 "http://www.bbc.co.uk" 而不仅仅是“www.bbc.co.uk”来实现)
  • 我会试试 exec()。为什么 cmd.exe 运行但没有参数?
  • 感谢您的帮助。我试过 exec() 但这没有用。听起来我需要从 DJGPP 继续前进,这很遗憾,因为我喜欢它。
  • @Dogbert system() 不调用 ShellExecute()。在 win32 中,system("c:\\temp\\test.txt") 运行 "cmd.exe c:\\temp\\test.txt"。这仍然允许您“运行”不是 exe 文件的文件。它将在 .txt 文件的默认编辑器中打开 .txt 文件。它将在默认的 .pdf 查看器中打开 .pdf 文件。虽然它不会直接处理 URL,但要做到这一点,你必须这样做,例如system("start http://www.google.com");(并且;DOS/DJGPP 中的 system() 与 win32 中的 system() 完全不同。)
猜你喜欢
  • 1970-01-01
  • 2011-08-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多