1

我正在为 Windows 编写一个程序,该程序最终必须启动位于同一台计算机上的不同的预先存在的 .exe。它将多个参数传递给这个 .exe 文件。我正在阅读实际的命令和参数并构建命令,但我也尝试用相同的结果对其进行硬编码。这是硬编码版本(我从一个使用same.exe的旧C程序中挑选出来):

system("c://IQapture//dmon2_6_IHD -p2 c://IQapture//mon_table_101_Tx8.txt 11 0 0");

所以在原程序里面int _cdecl main(int argc, char**argv)这种系统的使用是有效的。在我的 C++ 类方法中的 C++ 程序中,当我发出命令时,正确的程序会启动,但它会立即弹出一个错误对话框,指出发生了错误。我将用于启动 exe 的系统字符串回显到控制台。在它失败后,我复制并粘贴了与 echo'd 相同的行,这次 exe 运行没有错误。这是可重复的。如果与时间有关,我尝试在发出系统命令之前添加 10 秒延迟,但这没关系。加上原来的旧程序不需要延迟。这对我来说意味着字符串是正确的并且目标程序可以工作。不知何故,system() 调用与直接命令行调用不同。该程序编译并构建良好。我正在使用 Visual Studio 2010。

有没有人知道如何使 system() 调用像命令行调用一样工作?

4

3 回答 3

3

这看起来真的不像是 Windows 会喜欢的那种东西……试试用反斜杠代替:

system("c:\\IQapture\\dmon2_6_IHD -p2 c:\\IQapture\\mon_table_101_Tx8.txt 11 0 0");

如果这仍然不起作用,您很可能遇到以下问题之一:

  • 您当前的工作目录错误;
  • 缺少环境变量;
  • 您的程序以错误的用户权限运行;
  • 您的程序正在占用生成的进程所需的资源(例如,您没有关闭它需要作为输入的文件)。
于 2013-01-29T02:19:04.503 回答
2

有很多事情需要考虑——环境、运行程序的用户、父进程以及继承的内容……看看CreateProcess函数的参数。您的系统调用的调用可能与命令行的调用不匹配(尽管这可能不是问题,但更简单的事情更有可能。)

在深入研究诸如创建标志和安全属性之类的事情之前,我建议从错误开始向后排除简单的原因,例如环境、当前目录等。

于 2013-01-29T02:16:07.757 回答
1

你有你的斜线向后。尝试:

system("c:/IQapture/dmon2_6_IHD -p2 c:/IQapture/mon_table_101_Tx8.txt 11 0 0");

您可以使用反斜杠\,但因为这是字符串中的转义序列起始符(对于 C/C++),这就是为什么您连续使用两个。由于编译器将转换\\为字符串中的单个斜杠:

因此:

system("c:\\IQapture\\dmon2_6_IHD -p2 c:\\IQapture\\mon_table_101_Tx8.txt 11 0 0");

// Is equivelent to the command line string:

> c:\IQapture\dmon2_6_IHD -p2 c:\IQapture\mon_table_101_Tx8.txt 11 0 0

但是 Windows 支持这两种类型的斜线的时间比我记得的要长。所以下面的命令行是等价的。

> c:/IQapture/dmon2_6_IHD -p2 c:/IQapture/mon_table_101_Tx8.txt 11 0 0

在字符串中使用“/”(在 C/C++ 中)不需要转义。所以你只需要按原样使用它:

system("c:/IQapture/dmon2_6_IHD -p2 c:/IQapture/mon_table_101_Tx8.txt 11 0 0");
于 2013-01-29T03:28:25.940 回答