MFC使用命令行参数

时间:2023-02-08 14:31:43
大家好,我请教个问题,我做了一个mfc程序,这个程序需要接收一个命令行参数,然后我就在工程-》属性-》配置属性-》调试-》命令行参数中输入了“www.baidu.com”(我的程序需要打开一个网页),然后在程序中使用CString addr = AfxGetApp()->m_lpCmdLine;也得到了我输入的“www.baidu.com”,但是运行时却出现D:\xxx\CEF\CEF\www.baidu.com was not found(前面的路径是我的工程路径),这是什么原因,是我设置有错吗,还是那个地方没有设置。

谢谢!

12 个解决方案

#1


用 __argc 判断个数 __argv 取参数
第一个参数是程序启动命令行 后面的才是参数

#2


用GetCommandLine()

#3


把 “D:\xxx\CEF\CEF\www.baidu.com” 的路径 去掉。

#4


引用 3 楼 schlafenhamster 的回复:
把 “D:\xxx\CEF\CEF\www.baidu.com” 的路径 去掉。
什么意思, “D:\xxx\CEF\CEF\www.baidu.com” 并不是我输入的啊。

#5


你在调试-》命令行参数 输入的东西 会带上路径, 所以 要 砍掉 路径
你可以用 strrchr("d:\\xxxxx",'\\') 来 砍掉 路径。 

#6


引用 5 楼 schlafenhamster 的回复:
你在调试-》命令行参数 输入的东西 会带上路径, 所以 要 砍掉 路径
你可以用 strrchr("d:\\xxxxx",'\\') 来 砍掉 路径。 
还是不明白,因为我调试得到了我输入的东西啊,要不,你可不可以示例一下,比如我要发送个“1”给应用程序使用该如何做,谢了

#7


运行 是 在 “debug” 目录 下 ?
调试 是 在 工程目录下。

#8


__argc 表示个数 
__argv 表示参数 
  __argv[0] 就是你启动应用程序的完整路径 
  __argv[1] 传入的一个参数
  __argv[n] 传入的第n-1个参数


  for(int i=0; i<__argc; i++)
  {
    TRACE(_T("arg%d = %s\n"), i, __argv[i]);
  }


还可以用 PathGetArgs 可以取出参数 自己解析

#9


通常 在 “debug” 下 运行程序。
IDE 设置的 参数, 不会 起作用

#10


问题解决,但是与楼上给出的方法毫无关系,我问题的原因,我原本建的是一个单文档的mfc工程,但是发现出错是在代码:
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);//他把我输入的参数当成了文件进行处理,导致出错。

解决方法:建立一个基于对话框的mfc,他就没有上述的解析错误,可以直接使用该参数。
总之,就是把单文档改成了对话框。

#11


我想起来了,dos 下有 3种 可执行 文件 .com;.exe;.bat.

#12


我没有测试,但是网上介绍说这种方法可以:
BOOL CMyWinApp::InitInstance()
{
...
// Parse command line for standard shell commands, DDE, file open
   CCommandLineInfo cmdInfo;
   ParseCommandLine(cmdInfo);
// DON'T display a new MDI child window during startup!!!
   cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
// Dispatch commands specified on the command line
   if (!ProcessShellCommand(cmdInfo))
      return FALSE;
...
};

#1


用 __argc 判断个数 __argv 取参数
第一个参数是程序启动命令行 后面的才是参数

#2


用GetCommandLine()

#3


把 “D:\xxx\CEF\CEF\www.baidu.com” 的路径 去掉。

#4


引用 3 楼 schlafenhamster 的回复:
把 “D:\xxx\CEF\CEF\www.baidu.com” 的路径 去掉。
什么意思, “D:\xxx\CEF\CEF\www.baidu.com” 并不是我输入的啊。

#5


你在调试-》命令行参数 输入的东西 会带上路径, 所以 要 砍掉 路径
你可以用 strrchr("d:\\xxxxx",'\\') 来 砍掉 路径。 

#6


引用 5 楼 schlafenhamster 的回复:
你在调试-》命令行参数 输入的东西 会带上路径, 所以 要 砍掉 路径
你可以用 strrchr("d:\\xxxxx",'\\') 来 砍掉 路径。 
还是不明白,因为我调试得到了我输入的东西啊,要不,你可不可以示例一下,比如我要发送个“1”给应用程序使用该如何做,谢了

#7


运行 是 在 “debug” 目录 下 ?
调试 是 在 工程目录下。

#8


__argc 表示个数 
__argv 表示参数 
  __argv[0] 就是你启动应用程序的完整路径 
  __argv[1] 传入的一个参数
  __argv[n] 传入的第n-1个参数


  for(int i=0; i<__argc; i++)
  {
    TRACE(_T("arg%d = %s\n"), i, __argv[i]);
  }


还可以用 PathGetArgs 可以取出参数 自己解析

#9


通常 在 “debug” 下 运行程序。
IDE 设置的 参数, 不会 起作用

#10


问题解决,但是与楼上给出的方法毫无关系,我问题的原因,我原本建的是一个单文档的mfc工程,但是发现出错是在代码:
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);//他把我输入的参数当成了文件进行处理,导致出错。

解决方法:建立一个基于对话框的mfc,他就没有上述的解析错误,可以直接使用该参数。
总之,就是把单文档改成了对话框。

#11


我想起来了,dos 下有 3种 可执行 文件 .com;.exe;.bat.

#12


我没有测试,但是网上介绍说这种方法可以:
BOOL CMyWinApp::InitInstance()
{
...
// Parse command line for standard shell commands, DDE, file open
   CCommandLineInfo cmdInfo;
   ParseCommandLine(cmdInfo);
// DON'T display a new MDI child window during startup!!!
   cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
// Dispatch commands specified on the command line
   if (!ProcessShellCommand(cmdInfo))
      return FALSE;
...
};