IPMsg源码阅读笔记(1)
来源:互联网 发布:阿里云的前端面试题 编辑:程序博客网 时间:2024/05/17 00:16
打开下载的源码包,成功的导入VS2013后是一个名字为IPMsg的解决方案,这个解决方案里面有6个项目:--install--IPMsg--libpng--TLib--uninst--zlib至于每个项目什么功能,我会在之后的源码分析给出,现在就先直接进入IPMsg工程,看看程序是如何运行起来的。找到ipmsg.cpp文件,在这个文件的最后就是入口点函数WinMain,定义如下:
//ipmsg.cpp/line151int WINAPI WinMain(HINSTANCE hI, HINSTANCE, LPSTR cmdLine, int nCmdShow) //{ if (IsWin95()) { MessageBox(0, "Please use old version (v2.06 or earlier)", "Win95/98/Me is not supported", MB_OK); ::ExitProcess(0xffffffff); return 0; } TMsgApp app(hI, cmdLine, nCmdShow); return app.Run();}
(1)
这里详细解释一下WinMain()函数的几个参数:
HINSTANCE hInstance —程序当前实例的句柄,以后随时可以用GetModuleHandle(0)来获得
HINSTANCE hPrevInstance —这个参数在Win32环境下总是0,已经废弃不用了。要特别注意的是这里省略了形参列表中的参数名的这个用法。
char * lpCmdLine —指向以/0结尾的命令行,不包括EXE本身的文件名,以后随时可以用GetCommandLine()来获取完整的命令行
int nCmdShow —指明应该以什么方式显示主窗口,就是说窗口被创建出来的时候是最大化显示还是最小化显示等这些特性.
(2)
IsWin95()定义如下:
//tlib.h/line77IsWin95() (LOBYTE(LOWORD(TWinVersion)) >= 4 && TWinVersion >= 0x80000000)//tmisc.cpp/line18DWORD TWinVersion = ::GetVersion();
TWinVersion是一个DWORD类型的参数
::GetVersion()是一个系统函数,声明如下:
WINBASEAPI DWORD WINAPI GetVersion (VOID);
但是找不到相关的定义,想必是windows不开源的原因隐藏了相关的定义。如果函数执行成功,返回的低字部分(低16bit)是操作系统的主次版本号,高字部分(高16bit)保存着操作系统平台的信息。
IsWin95()的意义就在于低字的低字节(即主版本号)大于等于4且高字大于等于0x8000的话返回true,否则则是false.
参看http://www.oschina.net/code/snippet_54100_5403 和 MSDN
低字:低字节包含了主版本号,3代表windows3.10,4代表了nt4.0.高字节包含了两个数位的辅助版本号(10代表windows3.10, 95代表windows95)。高16位则包含了平台的信息。针对windowsNt,高位设为0;对于windows for workgroup上的win32s高位为1.
IsWin95()函数的功能就是系统版本为win95或者更老版本的话,返回true;
在本程序中如果版本不够新就弹出一个对话框然后退出程序,进程的退出码设定为0xffffffff。
(3)关于MessageBox
WINUSERAPIintWINAPIMessageBoxA( __in_opt HWND hWnd, //对话框的父窗口句柄,对话框显示在delphi窗体内,可以使用窗体的handle属性,否则可用0表示直接作为桌面窗口的子窗口 __in_opt LPCSTR lpText,//表示想要显示的信息字符串 __in_opt LPCSTR lpCaption,//表示想要显示的对话框标题__in UINT uType);//表示对话框类型的常量//返回值:返回值为整数表示对于对话框按钮的识别。
(4)
如果操作系统版本在win95之上的话,就定义TMsgApp类的实例,然后调用该类的Run()成员函数。
(5)
本篇文章就写到这里,这篇文章主要是阅读了winmain()函数,比较简单。接下来将阅读TMsgAPP类的内容。
- IPMsg源码阅读笔记(1)
- IPMsg源码阅读笔记(0)
- IPMsg(飞鸽传书)文件发送源码分析
- waste源码阅读笔记(1)
- YunTable源码阅读笔记(1)
- go源码阅读笔记(math.1)
- Fragment相关源码阅读笔记(1)
- EventBus源码阅读笔记(1)
- java源码阅读笔记(1)- Object
- ipmsg学习笔记1—系统用户信息
- ipmsg学习笔记3—多线程1
- CentOS 5.3 下源码编译安装Ipmsg 笔记
- CentOS 5.3 下源码编译安装Ipmsg 笔记
- x264源码阅读笔记1
- ActiveAndroid 源码阅读笔记 (1)
- ViewFlow 源码阅读笔记(1)
- flashsim源码阅读笔记1
- SDL源码阅读笔记(1) 基本模块
- PyQt5教程 - QtDesigner窗口设计工具的使用
- C++虚函数(11) - 纯虚函数与抽象类
- java中Statement详细用法。
- 第一章 Apache Hadoop的介绍
- oh my zsh mac 安装方法
- IPMsg源码阅读笔记(1)
- android 与 php交互 获取复杂json数据 +正在加载效果理解
- C++虚函数(12) - 纯虚析构函数
- LCD显示
- 自定义Tabs
- JAVA中实现double型数字丛右至左每三位用逗号隔开
- LeetCode | Contains Duplicate
- NSString属性什么时候用copy,什么时候用strong?
- 很好的iOS博客地址