高手请进!关于getcommandline()函数的问题

nomenn 2004-08-05 07:19:05
在win32程序中,可以实现在命令行中输入一个参数控制这个程序,
可是如果希望在命令行中输入一个参数控制MFC程序,请问如何实现,
比如说在命令行中输入aaa tuichu,使aaa这个程序退出。因为MFC程序没有main函数,所以不能和win32程序一样在main 函数中实现,一个高手告诉我用getcommandline()函数可以实现,请问如何实现。
在线等,分数不够可以加!
...全文
3158 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
nomenn 2004-08-07
  • 打赏
  • 举报
回复
啊,我大概知道原因了,好像holyeagle(一杯清茶)说的很对!我已经搞定了,一会揭帖!
zkxz 2004-08-06
  • 打赏
  • 举报
回复
int argc=0;
LPWSTR *argv=::CommandLineToArgvW(::GetCommandLineW(),&argc);
这样写就可以取得参数了,其中argc是参数个数,argv[0]存的是程序的路径,从argv[1]开始存的是参数。

注意,用这种方法的话,在程序运行时,每个参数之间必须有空格。
nomenn 2004-08-06
  • 打赏
  • 举报
回复
谢谢两位带星的建议,我去试试看。
holyeagle 2004-08-06
  • 打赏
  • 举报
回复
你是否在setting里面设定了debug的参数.如果是debug模式,参数不是通过cmd输入的
carbon107 2004-08-06
  • 打赏
  • 举报
回复
const char * strCommandLine = GetCommandLine();
就是说用这个函数得到你输入的命令的字符串,然后与你要退出的字符比较,如果匹配,那么你就得到你要关闭程序的句柄,然后给其发送关闭的消息呀
用FindWindow来得到句柄,用SendMessage发WM_CLOSE消息
如果FindWindow 也找不到你的程序,就枚举进程来找,方法多多的

希望对你有所帮助
zkxz 2004-08-06
  • 打赏
  • 举报
回复
不会啊!我都这样做了几个程序了。

你建一个对话框工程TestCmdLine,把下面这段代码加进去:
BOOL CTestCmdLineDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here
int argc=0;
LPWSTR *argv=::CommandLineToArgvW(::GetCommandLineW(),&argc);

for(int i=0;i<argc;i++)
{
CString msg=argv[i];
MessageBox(msg,"Information");
}
return TRUE; // return TRUE unless you set the focus to a control
}
编译之后,由命令行进入debug目录,敲
TestCmdLine aa bb cc dd
试试?

反正在我的电脑上运行是正确的。
Kudeet 2004-08-06
  • 打赏
  • 举报
回复
直接用CommandLineToArgvW()函数试试
nomenn 2004-08-06
  • 打赏
  • 举报
回复
呵呵,我试过了,是得到当前进程的路径了,不是“d:\program files\aa>aa bb cc dd ee”,
无敌魔仙 2004-08-06
  • 打赏
  • 举报
回复
这是SDK版本,修改一下就应该可以做MFC得用
//for command line begin
lpCmdLine=GetCommandLine();
char seps[] = " ";
char *token;

token = strtok( lpCmdLine, seps );
while( token != NULL )
{
if(strcmp(token,"-close")==0)
{
//匹配 }

token = strtok( NULL, seps );
}
//for command line end
nomenn 2004-08-06
  • 打赏
  • 举报
回复
nomenn 2004-08-06
  • 打赏
  • 举报
回复
再顶
nomenn 2004-08-06
  • 打赏
  • 举报
回复
怎么没人??自己顶
zkxz 2004-08-06
  • 打赏
  • 举报
回复 1
to 楼主,
你可以用::MessageBox(NULL,GetCommandLine(),NULL,0)来显示^_^
nomenn 2004-08-06
  • 打赏
  • 举报
回复
to: zkxz()
你确信GetCommandLine()会返回字符串“d:\program files\aa>aa bb cc dd ee”,我debug后得到的怎么是得到当前进程的路径,而不是我在cmd中输入的路径啊,是不是因为这个函数得到的是当前进程的路径,而我debug程序,所以他得到的是我debug程序的路径,不知道我说明白没有。
zkxz 2004-08-06
  • 打赏
  • 举报
回复
楼主,
你应该在cmd中敲你的程序名,比如程序名是d:\program files\aa\aa.exe,就这样敲
d:\program files\aa>aa bb cc dd ee (回车)

那么此时GetCommandLine()就会返回字符串“d:\program files\aa>aa bb cc dd ee”,
然后用LPWSTR *argv=::CommandLineToArgvW()进行转换,那么
argv[0]="d:\program files\aa\aa.exe"
argv[1]="bb"
argv[2]="cc"
argv[3]="dd"
argv[4]="ee"
nomenn 2004-08-06
  • 打赏
  • 举报
回复
自己顶
nomenn 2004-08-06
  • 打赏
  • 举报
回复
to: carbon107(<软件开发思想.h>) and DeautyFan(痴情浪子):
你们说的方法我不太清楚什么意思,GetCommandLine()函数好像得到的不是输入的命令的字符串,而是得到正在运行的这个进程的路径,比如说我运行的是d:/program files/aa/aa.exe,得到的就是d:/program files/aa/aa.exe,怎么和在cmd中输入的字符比较啊??

16,471

社区成员

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

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

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