程序带文件路径参数运行文件路径带空格问题

eques11 2013-07-11 02:53:13
在Win8中用鼠标从系统选择文件后,通过在Context Menu中增加入口让自己写的sample.exe来处理该文件,比如Open操作,sample.exe的入口如下:
int _tmain(int argc, _TCHAR* argv[])
{
...
}
该工程用VS2012 Unicode charset编译。

现在遇到的问题是,当选择的文件路径长度等于或大于258 bytes时, 如果该路径有中有空格存在, 则整个文件路径通过参数传递到该exe时会被空格分隔子串,如:
用命令查看该exe运行时代的参数:
Command Line=“C;\xx\xx\sample.exe” d:\xx \11 xx22\test.txt
这里印出的C;\xx\xx\sample.exe为该exe实际运行路径, d:\xx \11 xx22\test.txt长度为258bytes,这里有省略多余字串。
当该参数传递到main函数中时:
argc = 4;
argv[0] = "C;\xx\xx\sample.exe"
argv[1] = "d:\xx"
argv[2] = "\11"
argv[3] = "xx22\test.txt"
因此整个文件被空格分隔成了多个字串,而当有多个连续的空格时,多余的空格无法得知,这样即使把后面这几段组合起来未必也是正确的路径。

请问大侠们有没有办法在该exe中获取到这种完整路径?是否跟exe工程设置有关?
当文件路径小于258时, 可以看到后面带的参数是带引号的, 而等于258时不会带引号。
Command Line=“C;\xx\xx\sample.exe” "d:\Test.txt"
请问带不带引号是由File Explorer 这边选择文件系统决定的,还是有自己的exe决定的?
...全文
686 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2013-07-12
  • 打赏
  • 举报
回复
用引号把路径包含起来,同时对于目录路径可以看一下MAX_PATH
redui 2013-07-12
  • 打赏
  • 举报
回复
这个你更加不用担心,系统传递给你的参数肯定是加了引号的,你用 CommandLineToArgvW 函数把完整的命令行解析成一个个子参数。但是注意,如果某个子参数是有引号的(比如路径),你解析到的子参数也是带着引号的,需要你自己去除掉。如果没有引号,这个函数就不会识别出带空格的路径。 举个例子,假设命令行是 D:\program files\abc.exe D:\program files\def.txt,调用此函数得到的参数序列是: D:\program files\abc.exe D:\program files\def.txt 如果命令行是 "D:\program files\abc.exe" "D:\program files\def.txt",解析后的参数系列是: "D:\program files\abc.exe" "D:\program files\def.txt" 剩下的怎么做就不用说了吧,MSDN上关于这个函数的调用例子:

#include <windows.h>
#include <stdio.h>
#include <shellapi.h>

int __cdecl main()
{
   LPWSTR *szArglist;
   int nArgs;
   int i;

   szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
   if( NULL == szArglist )
   {
      wprintf(L"CommandLineToArgvW failed\n");
      return 0;
   }
   else for( i=0; i<nArgs; i++) printf("%d: %ws\n", i, szArglist[i]);

// Free memory allocated for CommandLineToArgvW arguments.

   LocalFree(szArglist);

   return(1);
}

eques11 2013-07-11
  • 打赏
  • 举报
回复
引用 1 楼 redui 的回复:
路径参数必须也用""包起来,不然会解析错误。应该把这个当做常识性问题记住。 通常路径不要搞得太长,使用太长太深的路径通常是RP不好^_^
关键是这个路径不是我自己来处理的,我是写了一个exe去接收这个参数,比如在一个txt文件上鼠标右键叫出来的menu选择“打开”, 这个时间会去叫NotePad.exe记事本去打开,我是写了一个类似的exe去替换Notepad.exe, 让打开的时候吧参数传给我这个exe去运行。 所以是在想exe这端有没有办法处理掉这种情况。
Eleven 2013-07-11
  • 打赏
  • 举报
回复
用引号包含起来吧,保险
redui 2013-07-11
  • 打赏
  • 举报
回复
路径参数必须也用""包起来,不然会解析错误。应该把这个当做常识性问题记住。 通常路径不要搞得太长,使用太长太深的路径通常是RP不好^_^

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧