win程序设计(第5版) chapter 1

Windows运作机制的核心是动态链接,系统的动态链接库主要位于\WINDOWS\SYSTEM32中,以后缀.dll形式保存。

其中Kernel、User和GDI为三个最主要的动态链接库,大多数典型的windows函数会对应到这三个模组中。

Kernel: 内存管理、文件I/O、多任务管理。

User: 使用者接口、窗口运作机制。

GDI: 图形设备接口、允许程序在输出设备上显示文字和图形。

当执行Windows程序时,它通过一个称作「动态链接」的过程与Windows相接。一个Windows的.EXE文件中有使用到的不同动态链接库的参考数据,所使用的函数即在那些动态链接库中。当Windows程序被加载到内存中时,程序中的呼叫被指向DLL 函数的入口。如果该DLL不在内存中,就把它加载到内存中。

当连结Windows程序以产生一个可执行文件时,必须连结程序开发环境提供的特定「引用链接库(import library)」。这些引用链接库包含了动态链接库名称和所有Windows函数呼叫的引用信息。连结程序使用该信息在.EXE文件 中建立一个表格,在加载程序时,Windows使用它将呼叫转换为Windows函数。

另外,MFC 对WIN API 进行了封装,隐藏了许多复杂的情节。

#include   
int main () 
{  
           printf ("hello, world\n") ; 
           return 0 ;  
} 

如上普通C语言程序(命令行)包含一个include声明,main函数(程序的进入点),一个对执行期链接库函数的呼叫(printf)和一个return语句。
而windows程序则有所不同:

#include  
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR szCmdLine, int iCmdShow)

{
    MessageBox(NULL, TEXT("Hello, WinAPI"), TEXT("HelloMsg"), 0);

    return 0;
}

Windows程序的进入点为WinMain,C语言执行的链接库函数printf被Windows API函数MessageBox所代替。
windows.h中包含的头文件中,较为重要的有:

  • WINDEF.H 基本型态定义
  • WINNT.H 支持Unicode的型态定义
  • WINBASE.H Kernel函数
  • WINUSER.H User接口函数
  • WINGDI.H GDI接口函数

Win程序进入点WinMain的声明在WINBASE.H中,声明的形式为:

int WINAPI WinMain (
    _In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPSTR lpCmdLine,
    _In_ int nShowCmd
    );

此外,windows程序中变量名普遍使用[匈牙利表示法]的命名系统,即在变量名称前加上小写的数据类型名称的缩写。如i表示int,sz表示以0结束的字符串。

WINAPI在WINDEF.H中定义:

#define WINAPI __stdcall

该语句指定了一个呼叫约定,包括如何生产机械码以在堆栈中放置函数呼叫的参数。许多Windows函数呼叫声明为WINAPI。

//对于刚刚的函数WinMain
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR szCmdLine, int iCmdShow)

第一个参数hInstance被称为执行体句柄,该句柄唯一地表示该程序,可以被其他函数用作参数。第二个参数hPrevInstance总是NULL(定义为0)。第三个参数用于执行程序的命令列,某些Windows应用程序利用它在程序启动时将文件加载内存。第四个参数指出程序最初显示的方式(大小,最小化等)。

MessageBox(NULL, TEXT("Aloha."), TEXT("Aloha!"), 0);

MessageBox函数用于显示短信息。第一个参数是窗口句柄,这里暂时为NULL。第二个参数是弹窗主体所显示的信息。第三个参数可以理解为弹窗的title。TEXT为一个封装字符串的宏。第四个参数用于指出希望显示在对话框中的按钮(具体定义在WINUSER.H中以MB_开始的常数)。对于第4个参数,可以通过'|'运算符来进行组合,包括按钮显示信息,对话框外观等。

MessageBox(NULL, TEXT("haha!"), TEXT("hehe"), MB_OK|MB_ICONWARNING);

这是一个例子.png

根据msgbox显示的情况不同,其返回值(返回值定义在WINUSER.H中)的类型也不同,返回的类型有IDYES、IDNO、IDCANCEL、IDABORT等。

The unexamined life is not worth living. So chase the dream and go further!

你可能感兴趣的:(win程序设计(第5版) chapter 1)