您的位置:首页 > 产品设计 > 产品经理

IPMsg源码阅读笔记(1)

2015-05-26 00:55 281 查看
打开下载的源码包,成功的导入VS2013后是一个名字为IPMsg的解决方案,这个解决方案里面有6个项目:
--install
--IPMsg
--libpng
--TLib
--uninst
--zlib
至于每个项目什么功能,我会在之后的源码分析给出,现在就先直接进入IPMsg工程,看看程序是如何运行起来的。
找到ipmsg.cpp文件,在这个文件的最后就是入口点函数WinMain,定义如下:


//ipmsg.cpp/line151
int 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/line77
IsWin95()       (LOBYTE(LOWORD(TWinVersion)) >= 4 && TWinVersion >= 0x80000000)
//tmisc.cpp/line18
DWORD 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

WINUSERAPI
int
WINAPI
MessageBoxA(
__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类的内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息