MFC 窗口程序如何在命令行里能运行

webphoenix 2008-09-08 08:38:04
比如我有个程序 test.exe
我用MFC Dialog模式创建了成功也完成功能,现在我想在DOS命令行下运行这个程序并传入参数,回车后希望在DOS窗口里直接输出结果,而不显示Dialog

比如我实现的是加法,我运行 c:\> test.exe 1 2 ,DOS窗口输出为 3

也就是让MFC的程序既能用GUI方式运行,也可以在Console下运行,
请问如何实现,谢谢!

有几个链接大家可以看一下,很类似

http://www.programmer-club.com/pc2020v5/forum/ShowSameTitleN.asp?URL=N&board_pc2020=vc&id=32395

http://onegazhang.spaces.live.com/?_c11_BlogPart_blogpart=blogview&_c=BlogPart&partqs=amonth%3d10%26ayear%3d2006
...全文
867 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
Neves_pa 2008-12-10
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 whoo 的回复:]
1. 窗口 和 console 两者兼备, 是可以的。
方法,首先按常规建立窗口程序,然后调用API AllocConsole() 创建console. 创建之后,就可以向普通的console程序一样,用print("hello world");输出到控制台了。
任何常规窗口程序都可以这样子简单处理,当然,要做好还可以加一些逻辑判断,如根据参数决定是否 创建console, 输出的时候也可以这么判断一下子。


2. 窗口和 console二选一,任何时候只有一个。


[/Quote]

我不明白啊,到底是怎么实现??可以发些代码说明一下吗?
发到我邮像也行:seven_0113@163.com
webphoenix 2008-09-17
  • 打赏
  • 举报
回复
谢谢各位,基本明白怎么回事了,
whoo 2008-09-14
  • 打赏
  • 举报
回复
1. 窗口 和 console 两者兼备, 是可以的。
方法,首先按常规建立窗口程序,然后调用API AllocConsole() 创建console. 创建之后,就可以向普通的console程序一样,用print("hello world");输出到控制台了。
任何常规窗口程序都可以这样子简单处理,当然,要做好还可以加一些逻辑判断,如根据参数决定是否 创建console, 输出的时候也可以这么判断一下子。


2. 窗口和 console二选一,任何时候只有一个。

这种方式实现方法就更简单了。

a. 最直接了当的, 一个console.exe, 一个window.exe。 一个主控.exe决定调用哪一个程序。
b. 嫌a难看的, 把console.exe和 window.exe的逻辑合到一个程序里面,由参数控制就可以了。
c. 最强悍的方式同样也非常简单。做成第一种窗口和console两者兼备的方式,用参数来决定是否显示console; 是否显示窗口;或者两者都有;或者二者均无。

看MSDN关于AllocConsole的相关资料就足够了。

lirongjun1985 2008-09-12
  • 打赏
  • 举报
回复
利用管道技术。可以上网查查。
webphoenix 2008-09-11
  • 打赏
  • 举报
回复
感谢各位高手

是这样的,首先保证是个MFC窗体程序,我双击运行就出现个窗体,当我在Window的CMD命令行里输入 XX.exe 加上一个适当的参数就不会出现Dialog窗口,而是直接在CMD窗口里打印出一个结果。

要实现这种,是要首先创建MFC程序,还是先创建Console程序,如果创建MFC程序,那么CMD命令行里的怎么实现
如果先创建Console程序,那么直接运行的时候的那个黑色的Console窗口怎么去掉?
jameshooo 2008-09-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ringphone 的回复:]
引用 6 楼 jameshooo 的回复:

做不到,一个程序要么是console子系统,要么是window子系统,这是在生成的PE文件里都要设定好的,不可能同时属于两个子系统。


完全可以,以下是API代码,带参数运行打印所有参数,不带参数显示一个对话框。MFC就不知道怎么弄了。

C/C++ code
#include <stdio.h>
#include <windows.h>
#include "resource.h"

BOOL Dlg1Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

int main(int…
[/Quote]

桌面上的控制台都是在window子系统下模拟控制台程序的管道,所以通过这种控制台能执行控制台程序和窗口程序,窗口程序启动之后这个“控制台”已经返回到了输入模式,可以再干别的事。但模拟的不是真的控制台,进入窗口系统之前可以选择进入控制台模式,这个才是真正的控制台,在这里任何window子系统的程序都无法启动,加载器会打印PE中特定区域保存的一段提示信息,这是加载器做的事,不是程序运行打印出来的,程序根本不会执行任何代码。

当然如果楼主只是想在桌面“控制台”上执行MFC程序,那么没有任何问题,执行去吧。
scq2099yt 2008-09-09
  • 打赏
  • 举报
回复
::AfxGetApp()->m_lpCmdLine 就是传入参数,具体你要去解析了。

你在窗口创建之前就去读取参数判断
用户 昵称 2008-09-09
  • 打赏
  • 举报
回复
在windows下,你也可以用 __argv[ 0 ], __argv[ 1 ]来接收参数,俺总用这个。
ringphone 2008-09-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jameshooo 的回复:]
做不到,一个程序要么是console子系统,要么是window子系统,这是在生成的PE文件里都要设定好的,不可能同时属于两个子系统。
[/Quote]

完全可以,以下是API代码,带参数运行打印所有参数,不带参数显示一个对话框。MFC就不知道怎么弄了。

#include <stdio.h>
#include <windows.h>
#include "resource.h"

BOOL Dlg1Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

int main(int argc,char* argv[])
{
if(argc > 1)
{
for(int i=0;i<argc;i++)
{
printf(argv[i]);
printf("\n");
}
}
else
{
DialogBox((HINSTANCE)GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)Dlg1Proc);
}
return 0;
}

BOOL Dlg1Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_CLOSE:
EndDialog(hWnd,TRUE);
return TRUE;
}
return FALSE;
}
found8 2008-09-09
  • 打赏
  • 举报
回复
没弄过,路过,学习一下
pangqi022 2008-09-09
  • 打赏
  • 举报
回复
mark
gaoxiaowei 2008-09-09
  • 打赏
  • 举报
回复
Mark
jia_xiaoxin 2008-09-09
  • 打赏
  • 举报
回复
可以通过管道的重定向
sjdev 2008-09-09
  • 打赏
  • 举报
回复
命令行直接就可以运行的,App还可以解析命令行消息呢?
有个类叫CCommandLineInfo,就是用来解析命令行(或者快捷方式)参数。
请参看CWinApp::ParseCommandLine()函数。
「已注销」 2008-09-09
  • 打赏
  • 举报
回复
路过~~学习~~
marine8086 2008-09-09
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 ringphone 的回复:]
引用 14 楼 jameshooo 的回复:
桌面上的控制台都是在window子系统下模拟控制台程序的管道,所以通过这种控制台能执行控制台程序和窗口程序,窗口程序启动之后这个“控制台”已经返回到了输入模式,可以再干别的事。但模拟的不是真的控制台,进入窗口系统之前可以选择进入控制台模式,这个才是真正的控制台,在这里任何window子系统的程序都无法启动,加载器会打印PE中特定区域保存的一段提示信息,这是加载器做的事,不是程序运…
[/Quote]

学习了
xd_yhz1 2008-09-09
  • 打赏
  • 举报
回复
学习一下 没玩过
jameshooo 2008-09-09
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 ringphone 的回复:]
sorry,可能误解了你的意思,因为LZ讲的是DOS窗口,如果真要是可双系统运行,还真有点难办,不过好象WINDOWS的安装程序是可以的?
[/Quote]

没关系,讨论问题怎么讨论都行。
windows安装程序有两个,一个是winnt32.exe,一个是winnt.exe,分别用于两种子系统。以前手工执行过所以记得,现在的操作系统没关注。
ringphone 2008-09-09
  • 打赏
  • 举报
回复
sorry,可能误解了你的意思,因为LZ讲的是DOS窗口,如果真要是可双系统运行,还真有点难办,不过好象WINDOWS的安装程序是可以的?
ringphone 2008-09-09
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jameshooo 的回复:]
桌面上的控制台都是在window子系统下模拟控制台程序的管道,所以通过这种控制台能执行控制台程序和窗口程序,窗口程序启动之后这个“控制台”已经返回到了输入模式,可以再干别的事。但模拟的不是真的控制台,进入窗口系统之前可以选择进入控制台模式,这个才是真正的控制台,在这里任何window子系统的程序都无法启动,加载器会打印PE中特定区域保存的一段提示信息,这是加载器做的事,不是程序运行打印出来的,程序根本不会执行任何代码。[/Quote]

呵呵,DOS下无法运行WINDOWS程序这是常识,就算模拟出了窗口来也还是DOS程序而不是WINDOWS程序。那LZ的问题就没有意义了。
从你讲的这个倒是可以说任何WINDOWS程序都是可双系统运行的程序,因为在DOS下运行是显示This programe can't run...,在WINDOWS下则显示窗口。其实在DOS显示这个信息的是winstub.exe,在WIN3.X系统下还能找到这个文件,PE文件是集成了,如果修改这个信息,完全可以打印出Hello world!
加载更多回复(8)

16,467

社区成员

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

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

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