我发现了Windows错误吗?

时间:2012-08-24 14:11:08

标签: windows debugging windows-nt

使用“C:\ Program Files(x86)”我遇到了一个奇怪的问题,该程序位于该路径下方的某个位置。我用测试程序重现了这种行为。

    int _tmain(int argc, _TCHAR* argv[])
{
    wprintf(L"%d\n", argc);
    for (int i = 0; i < argc; i++) {
        wprintf(L"%s\n", argv[i]);
    }
    return 0;
}

程序计算并返回所有命令行参数(包括用于标识程序的程序路径)。我把它命名为“HelloWorld.exe”,因为我很着急。

对于运行程序的三种可能方式,它给出了两个不同的结果,而我期待相同的结果。

当我从自己的目录运行HelloWorld.exe时,输出为

1
HelloWorld.exe

该输出是正确的和预期的。

当我从另一个位置运行位于“P:\ Test(x86)”的HelloWorld.exe并使用引用路径时,输出为

1
P:\Test (x86)\HelloWorld.exe

该输出也是正确的和预期的。

但是,当我从其他位置运行HelloWorld.exe并使用带有转义空格和括号的路径时,找到程序(即路径正确),但输出错误:

2
P:\Test
(x86)\HelloWorld.exe

出于某种原因

中的逃逸空间

P:\ Test \ ^ ^(x86 ^)\ HelloWorld.exe

由于某种原因而成为空间读取操作符和Windows,在读取路径为一个字符串以查找程序之后,在创建该数组之前确定它实际上是两个字符串程序然后引用。

Windows XP(x86)和Windows Server 2008 R2(x64)中都会出现此问题。我认为它存在于所有(NT)版本的Windows中。

1 个答案:

答案 0 :(得分:5)

<强>更新

糟糕。也许这是Windows中的一个错误(或者可能是错误的术语)。

我刚刚制作了一个快速的小测试程序,只需调用GetCommandLine()并将其打印到控制台。

我打电话给:

test The^ rain^ in^ Spain^ falls^ mainly^ on^ the^ plain^ ^(or^ so^ they^ say^).

这是输出:

test  The rain in Spain falls mainly on the plain (or so they say).

所以我想运行时库根本看不到插入符号,你唯一的选择就是告诉用户使用引号而不是转义符。


不,这不是Windows中的错误。在C运行时库中,这是一个错误(尽管我可能更喜欢这个术语的缺点或不足)。

Windows正在处理转义字符并找到您的可执行文件。但这并不是将命令行分为参数的原因。 Windows不是调用main函数(在这种情况下为_tmain)。它只是在PE头中定义的入口点启动您的进程。在这个位置是一些C库代码(或动态调用它),在其他启动任务中,调用kernel32函数GetCommandLine(),然后在空格上分割,尊重引号,但显然不是插入符号。

真的,这并不奇怪。我不认为大多数人都知道你可以在Windows命令行上使用插入符来转义字符。我当然没有。

如果这对你造成了现实问题,有人实际上正在使用插入符转义来调用你的程序,你可以告诉他们停止,或编写你自己的命令行解析例程,传递给它输出GetCommandLine()的{​​{1}},并忽略您在main传递给您的内容。