imuncle / imuncle.github.io

大叔的个人小站
https://imuncle.github.io/
78 stars 17 forks source link

Win32程序编程入门 #90

Open imuncle opened 4 years ago

imuncle commented 4 years ago

两天前我突然回想自己当初是为什么想学编程的。

大约是高三毕业的那个暑假,我第一次尝试学习编程,当时也就听说过C语言,就上网百度,结果因为对编程一点概念都没有,直接点进了一个图形化编程的教学网站,最后也没学到啥东西,这网站现在好像已经找不到了。

后来大一的时候又决定学一次C语言,这次学乖了,下载了网上的C语言入门书籍的PDF(说实话那是我第一次知道还有PDF这种格式,之前我的脑子里就只有txt,excel,word和ppt),算是正式入门C语言了吧,在学习线性代数的时候因为不想手算矩阵,还用C语言写了一个矩阵计算器,但依旧是停留在命令行的交互阶段。

我其实一直想写出像Windows其他应用程序一样的东西,拥有窗口界面,用户鼠标点点点就行,人机交互良好,尤其喜欢那种单独一个exe执行文件,无需安装,无需解压,随表找台装有Windows系统的电脑,双击就能运行,体积也不大,可能也就2~3MB,特别喜欢这种小软件,比如我日常开发就用到一款类似的小软件XCOM.exe,是正点原子开发的。

再后来我接触了Qt,开发起来确实很方便,但是使用过后发现,我只是实现一个很简单的功能,但是打包出来的工程还需要带很多dll库文件,给其他人使用非常不方便,最最关键的是那些dll库体积真的很大,工程本身只有一百多KB,dll库文件加起来有几百MB,这谁顶得住啊,Debug版本和Release版本都是差不多的样子。

于是两天前我想,自己已经写代码两年有余了,如果连最初的目标都实现不了的话,还算什么程序员。

所以我把手伸向了Win32开发,使用最原生的Windows API,追求简洁小巧高效率,写自己的小工具,做一个自由软件开发者。另外我还要拜托IDE的束缚,直接使用文本编辑器写代码,这会让我对程序有更深入的认识,也带来更多的成就感。

直接贴上我的第一份代码吧:

#include <windows.h>

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    MessageBox(NULL, TEXT("Hello World!"), TEXT("大叔的第一个窗口程序"), MB_OK);
    return 0 ;
}

代码内容非常简单,只显示一个MessageBox,消息框里有一个确认按钮,点击后程序结束。

我直接使用gcc工具编译:

gcc message.c -o message.exe

我的代码保存为message.c,编译生成message.exe,运行效果如下: image

还不赖,真的运行起来了,显示了消息框,但是后面黑乎乎的命令行窗口是什么鬼啊,还是没能摆脱它的魔爪吗?

这还不是唯一的问题,更要紧的是,我将message.exe拷贝到其他电脑上后运行报错“无法启动此程序,因为计算机中丢失cygwin1.dll。尝试重新安装该程序以解决问题”: image

解决库依赖问题

这个问题我在这篇文章里找到了解决办法。

因为我比较懒,直接先在电脑里搜索了一下gcc.exe,发现还真有: image

也没多想,直接环境变量一配置就编译,结果由于这是基于cygwin的编译器,编译出来还需要cygwin1.dll静态库,果然啊,C/C++编译器还得首选MinGW,于是我下载了MinGW,然后用它的gcc编译,转移到其他电脑上,成功运行!

但是还是没摆脱命令行窗口。

告别CMD窗口

我找到了这篇文章,证实了里面的第二个方法能用,但是这方法有两缺点,一个是启动程序的时候用户会看见有一个黑框一闪而过,体验不佳,另一个是如果启动程序时恰好用户有运行其他命令行程序,那么打开后就会把其他命令行也关了,体验极差。

所以这不是最佳解决方法。

后来查资料了解到,我这还算是命令行程序,并不是真正的Win32程序,只要在编译时加入-mwindows就行了。

gcc -mwindows message.c -o message.exe

这下打开message.exe就不会有丑陋的命令行窗口了。

参考