And*_*ehm 5 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;
}
Run Code Online (Sandbox Code Playgroud)
程序计算并返回所有命令行参数(包括用于标识程序的程序路径).我把它命名为"HelloWorld.exe",因为我很着急.
对于运行程序的三种可能方式,它给出了两种不同的结果,而我期望得到相同的结果.
当我从自己的目录运行HelloWorld.exe时,输出是
1
HelloWorld.exe
Run Code Online (Sandbox Code Playgroud)
该输出是正确的和预期的.
当我从另一个位置运行位于"P:\ Test(x86)"的HelloWorld.exe并使用引用路径时,输出为
1
P:\Test (x86)\HelloWorld.exe
Run Code Online (Sandbox Code Playgroud)
该输出也是正确的和预期的.
但是,当我从另一个位置运行HelloWorld.exe并使用带有转义空格和括号的路径时,找到该程序(即路径是正确的),但输出错误:
2
P:\Test
(x86)\HelloWorld.exe
Run Code Online (Sandbox Code Playgroud)
由于某种原因,逃离的空间
P:\ Test\^ ^(x86 ^)\ HelloWorld.exe
由于某种原因和Windows成为空间读取操作符,在读取路径作为一个字符串来查找程序之后,在创建程序然后引用的数组之前,确定它实际上是两个字符串.
Windows XP(x86)和Windows Server 2008 R2(x64)中都会出现此问题.我假设它存在于所有(NT)版本的Windows中.
更新:
哎呀.也许这是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(),和忽略你传给你的东西main.
| 归档时间: |
|
| 查看次数: |
140 次 |
| 最近记录: |