如果一个软件想要同时实现GUI和CMD版本

__GUNS_N_ROSES__ 2011-06-25 07:59:10
RT,
想用C++做一个软件,并同时提供命令行版本和图形化版本,怎么去规划这个程序结构呢?

我能想到的是把公共类封装到DLL里去,然后分别编写两个版本独立部分。

你们有更好的思路吗?
...全文
243 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
scofield_cpu 2011-06-26
  • 打赏
  • 举报
回复
Learning++
__GUNS_N_ROSES__ 2011-06-26
  • 打赏
  • 举报
回复
先讨论到这,我先去实践下再来分享。
感谢各位参与,尤其感谢2楼和5楼。
结贴散分。
liutengfeigo 2011-06-26
  • 打赏
  • 举报
回复
Learning++
mLee79 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 hedy007 的回复:]

引用 5 楼 mlee79 的回复:

CUI GUI程序没啥区别, 就差一个字节, 你就做个GUI的, 如果需要控制台, attach/alloc 个控制台就是, 没这么麻烦...


盼说明
[/Quote]

比如这样, 如果你传递了命令行参数, 就以CUI运行, 否则以GUI运行....


#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
if( lpCmdLine && lpCmdLine[0] ){
/* CUI */
char line[1024];

if( !AttachConsole( ATTACH_PARENT_PROCESS ) )
AllocConsole();

freopen( "CON:" , "r" , stdin );
freopen( "CON:" , "w" , stdout );
freopen( "CON:" , "w" , stderr );

printf( "Hello World!\n" );
fgets( line , 1024 -1 , stdin );
printf( "%s\n" , line );
return 0;
}

/* GUI */
HWND mainWnd = CreateWindow( TEXT("EDIT"), TEXT("demo"), WS_OVERLAPPEDWINDOW|ES_MULTILINE ,
CW_USEDEFAULT , CW_USEDEFAULT , 480 , 360 , NULL, NULL, NULL, NULL);
ShowWindow( mainWnd , SW_SHOW );

for ( MSG msg; IsWindow(mainWnd) && GetMessage( &msg , NULL , 0 , 0 ) ; )
{
TranslateMessage( &msg );
DispatchMessage ( &msg );
}

return 0;
}

redleaves 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 mooke 的回复:]去看了...
好像跟我一开始设想的那样差不多,我导出了一下rarext.dll的函数名,一共也没几个函数看不大出来具体是如何封装的。不过是提取公共函数再实现两个版本应该是没错的。[/Quote]rarext.dll是shell扩展.不是具体的压缩代码.
其实这种设计原则很简单,把核心数据的处理和数据呈现分开,基本上就OK了.只不过是这样在一定程度上加大的复杂性,并且会对数据呈现的性能有一定的影响而已.
就拿记事本来说吧,对于文本的所有操作,我们可以把它封装起来,并提供相应的操作接口,数据呈现用的接口,事件通知的接口等等.然后根据不同的呈现形式,把这些基本的操作,数据,事件和相应的UI代码关联起来.
__GUNS_N_ROSES__ 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 taodm 的回复:]
看看它的exe目录也基本能猜出来了
[/Quote]
去看了...
好像跟我一开始设想的那样差不多,我导出了一下rarext.dll的函数名,一共也没几个函数看不大出来具体是如何封装的。不过是提取公共函数再实现两个版本应该是没错的。
miracaly 2011-06-25
  • 打赏
  • 举报
回复
学习了
hedy007 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mlee79 的回复:]

CUI GUI程序没啥区别, 就差一个字节, 你就做个GUI的, 如果需要控制台, attach/alloc 个控制台就是, 没这么麻烦...
[/Quote]

盼说明
taodm 2011-06-25
  • 打赏
  • 举报
回复
看看它的exe目录也基本能猜出来了
hedy007 2011-06-25
  • 打赏
  • 举报
回复
winrar 有CUI版本叫rar.exe
GUI版本WinRAR.exe
安装完成后就都有了。
__GUNS_N_ROSES__ 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 taodm 的回复:]

可以自己去看看winrar是怎么做的。
[/Quote]

winrar这种商业软件不开源的吧? 要怎么研究呢?
__GUNS_N_ROSES__ 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qq120848369 的回复:]

设计的好,就不必担心这些了。。。

松耦合。
[/Quote]

是这个道理,但我缺少经验,设计水准很大程度上依赖经验的。
这不是请教来了么,您有何高见呢?
__GUNS_N_ROSES__ 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mlee79 的回复:]

CUI GUI程序没啥区别, 就差一个字节, 你就做个GUI的, 如果需要控制台, attach/alloc 个控制台就是, 没这么麻烦...
[/Quote]
不需要CUI和GUI一起的,就是个通信软件,CUI也可以全部完成,仅仅是提供两种选择。
你说的是的GUI和CUI联用吧?

我也考虑过用命令行参数去切换,这样会不会更好些?
taodm 2011-06-25
  • 打赏
  • 举报
回复
可以自己去看看winrar是怎么做的。
qq120848369 2011-06-25
  • 打赏
  • 举报
回复
设计的好,就不必担心这些了。。。

松耦合。
xunxun 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mlee79 的回复:]

CUI GUI程序没啥区别, 就差一个字节, 你就做个GUI的, 如果需要控制台, attach/alloc 个控制台就是, 没这么麻烦...
[/Quote]
你这样说,人家不明白滴
mLee79 2011-06-25
  • 打赏
  • 举报
回复
CUI GUI程序没啥区别, 就差一个字节, 你就做个GUI的, 如果需要控制台, attach/alloc 个控制台就是, 没这么麻烦...
xunxun 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mooke 的回复:]

引用 2 楼 xunxun1982 的回复:
还有的软件只有命令行版本,他的GUI界面只是后台调用了命令行版本

后台调用命令行版本的意思是在GUI界面软件里再开个后台线程用来运行命令行版本,然后把输出重定向到GUI界面吗?
[/Quote]
如果你不需要输出,那么就不用重定向
__GUNS_N_ROSES__ 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xunxun1982 的回复:]
还有的软件只有命令行版本,他的GUI界面只是后台调用了命令行版本
[/Quote]
后台调用命令行版本的意思是在GUI界面软件里再开个后台线程用来运行命令行版本,然后把输出重定向到GUI界面吗?
xunxun 2011-06-25
  • 打赏
  • 举报
回复
还有的软件只有命令行版本,他的GUI界面只是后台调用了命令行版本
加载更多回复(1)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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