由Process.Start()启动的应用程序不会获得参数

时间:2014-06-02 18:15:19

标签: c# process.start processstartinfo

使用C#,我试图使用Process.Start()将命令行参数传递给新进程:

string path = @"C:\Demo\Demo.exe";
string arguments = "one two three";
ProcessStartInfo startInfo = new ProcessStartInfo
   {
      FileName = path,
      Arguments = arguments
   };
var process = Process.Start(startInfo);

我的C应用程序Demo.exe只是回显命令行参数:

int main( int argc, char *argv[] )
{
   int count=0;

   // Display each command-line argument.
    printf( "\nCommand-line arguments:\n" );
    for( count = 0; count < argc; count++ )
        printf( "  argv[%d]   %s\n", count, argv[count] );

    while(1);
}

如果我从cmd.exe启动我的应用程序,我得到合理的输出:

Command-line arguments:
 argv[0]   Demo.exe
 argv[1]   one
 argv[2]   two
 argv[3]   three

当我使用C#应用程序时,我唯一得到的是argv [0]中的path参数:

Command-line arguments:
  argv[0]   C:

任务管理器显示每个启动Demo.exe的方法的命令行参数: enter image description here

为什么我的C应用程序没有从C#应用程序接收命令行参数?

修改 @hvd建议我使用GetCommandLine()。以下是代码和结果:

char* ar = GetCommandLine();
printf( "\nGetCommandLine arguments:\n" );
printf("  %s", ar);

输出:

GetCommandLine arguments:
  "C:

C应用程序是否可能将args作为一个字符串接收,但忽略路径中第一个\之后的所有内容?

编辑:我在下面添加了答案。这是一种解决方法,但我不确定问题的原因。

3 个答案:

答案 0 :(得分:4)

我今天已经回到这里并且有一个解决方法正在运作。我不明白为什么我原来的尝试没有用。

这是命令行Demo.exe和“Demo.exe”之间的区别。

C:\Users\me\Desktop\Work\Builds\Win32>Demo.exe one two three
There are 4 arguments.
Command-line arguments:
argv[0]: Demo.exe
argv[1]: one
argv[2]: two
argv[3]: three

C:\Users\me\Desktop\Work\Builds\Win32>"Demo.exe" one two three
There are 1 arguments.
Command-line arguments:
argv[0]: Demo.exe

Process.Start()调用似乎正在进行“Demo.exe”变种。

不起作用:

ProcessStartInfo startInfo = new ProcessStartInfo
{
   FileName = @"Demo.exe",
   WorkingDirectory = @"C:\Users\me\Desktop\Work\Builds\Win32",
   Arguments = "one two three"
 };
 var process = Process.Start(startInfo);

There are 1 arguments.
Command-line arguments:
argv[0]: C:

工作:

ProcessStartInfo startInfo = new ProcessStartInfo
{
   FileName = "cmd.exe",
   WorkingDirectory = @"C:\Users\me\Desktop\Work\Builds\Win32",
   Arguments = "/C Demo.exe one two three"
 };
 var process = Process.Start(startInfo);
There are 4 arguments.
Command-line arguments:
argv[0]: Demo.exe
argv[1]: one
argv[2]: two
argv[3]: three

有没有人有任何想法为什么第一种方法不起作用?

答案 1 :(得分:3)

我能够重现你的问题。我没有访问C,所以我在Visual Studio 2013中使用了C ++。看来C#使用 StartInfo 将参数传递为 Unicode 字符,所以第一个字节非零,而第二个字节可能是0位,导致仅显示第一个字符,因为它表示字符串终止字符。当我使用printf它不起作用时,我不得不使用_tprintf来查看传递的内容。而printf不处理 Unicode 。 printf不仅无法处理它,填充 argv 时,您的C程序不会将 Unicode 转换为使用1个字节字符的字符串。虽然C ++中的TCHAR(宽字符)和tprintf确实如此,但C#本身也是如此。

所以,当你以另一种方式做到这一点时,使用&#34; cmd.exe&#34; 来调用&#34; / C Demo.exe一两三&#34 ; cmd未将字符串作为 Unicode 传递。鉴于我得到的结果,这是我的假设。

StackOverflow上的相关问题

正确显示参数(tprintf)且错误(printf)

的C ++代码
#include "stdafx.h"
#include "string.h"

int _tmain(int argc, _TCHAR* argv[])
{
    int count=0;

    // Display each command-line argument.
    printf( "\nCommand-line arguments:\n" );
    for( count = 0; count < argc; count++ )
        //Correct. This statement worked, displaying the arguments
        //_tprintf( _T("  argv[%d]   %s\n"), count, argv[count] );

        //Incorrect. Displayed only the first character of each argument
        //printf( "  argv[%d]   %s\n", count, argv[count] );

getchar();
return 0;

}

这是调用它的C#代码

namespace ProcessPassArguments
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @"C:\Temp\Demo.exe";
                    string arguments = "one two three";
            ProcessStartInfo startInfo = new ProcessStartInfo
            {
                FileName = path,
                Arguments = arguments
            };
            var process = Process.Start(startInfo);
        }
    }
}

仅供参考,C#调用C#也有效。同样可疑的原因是C#将参数作为 Unicode 字符传递给您的C程序。

用作编程目标的C#代码。

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            foreach (string arg in args)
            {
                i++;
                Console.WriteLine("Argument {0}: {1}", i, arg);
            }
            Console.ReadLine();
        }

    }
}

答案 2 :(得分:-1)

试试这个

Arguments = "\"arg1\" \"arg2\" \"arg3\"";