Windows API 编程入门
Windows 工作原理的中心思想就是“动态链接”概念。Windows 自身带有一大套函数,应用程序就是通过调用这些函数
来实现它的用户界面和在屏幕上显示文本和图形的。这些函数都是在动态链接库里实现的。
这些文件的名称都带有后缀 .dll,或有时带有 .exe。
Windows 的 3 个主要子系统:内核(kernel),用户(user),GDI。
内核 负责操作系统的传统工作:如 内存管理,文件输入/输出 以及任务管理等。
用户 指的是用户界面,负责所有的窗口管理。
GDI 就是图形设备接口,负责在屏幕或打印机上显示文本与图形。
在 Windows 程序中,调用 Windows 函数与调用 C 语言的库函数没有什么两样。
最主要的区别就是 C 语言库函数的机器代码会直接链接到你的程序代码中去,而 Windows 函数则是放到你的程序之外的 DLL 里。
Windows 程序运行时,它通过一个叫“动态链接”的进程与 Windows 接口。
每个 Windows 的 EXE 文件包含它所要用到的各个动态链接库以及库中的函数的引用地址。
当一个 Windows 程序被装入内存后,程序中的函数调用都被解析 DLL 函数入口的指针,同时这些被调用的函数也被装入内存。
当链接 Windows 程序以生存可执行文件时,一定得链接你的编程环境所提供的特殊的“导入库”。
这些导入库包含所有 Windows 函数调用要碰到的动态链接库的名字及引用信息。链接程序利用这些信息构建 EXE 文件中的表格,
当装入程序的时候,Windows 要靠这些表格来解析 Windows 函数调用。
另外值得提醒的一点是,MFC 是对 API 的封装,隐藏了许多复杂的情节。
Windows 的 Hello World!程序:
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
MessageBox (NULL, TEXT ("Hello, World!"), TEXT ("HelloMsg"), MB_OKCANCEL) ;
return ;
}
该程序的 #include<windows.h> 就是像 C 语言的 #include<stdio.h> 一样重要的头文件。
而 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
就像 C 语言的 int main(void) 一样,都是程序的入口。C 程序的入口是 main,Windows 程序的入口是 WinMain。
绝大多数的 Windows 程序都遵循“匈牙利标记法”:
变量名前都有一个短前缀,用以表明该变量的数据类型。
| 前缀 | 数据类型 |
| c | char 或 WCHAR 或 TCHAR |
| by | BYTE(无符号字符) |
| n | short(短整型) |
| i | int(整型) |
| x,y | int,表示 x 坐标和 y 坐标 |
| cx,cy | int,表示 x 或 y 的长度,c 表示“count”(计数) |
| B 或 f | BOOL(int); f 表示“flag” |
| w | WORD(无符号短整型) |
| l | LONG(长整型) |
| dw | DWORD(无符号长整型) |
| fn | 函数 |
| s | 字符串 |
| sz | 以零结束的字符串 |
| h | 句柄 |
| p | 指针 |
WinMain的第一个参数叫做"实例句柄"(Instance Handle)。句柄就是一个数值,用它来标识某些东西。
句柄是一个 4byte 的数值,可用来标识 窗口,按钮,图标,滚动条,输出设备,控件或者文件等等。
WinMain的第二个参数通常是 NULL。
WinMain的第三个参数是用来运行程序的命令行(CommandLine)。
WinMain的第四个参数是用来指明程序最初如何显示。(最大化到全屏,正常显示,最小化到任务栏)。
MessageBox函数:
第一个参数通常是一个窗口句柄。
第二个参数是在信息框里出现的文本字符串。
第三个参数是标题栏上显示的文本字符串。
第四个参数是以前缀MB_开头的一些常量组合。用以对话框中的按钮,图标等等。
函数的调用: MessageBox( hWnd, TEXT("信息框里的内容“), TEXT("标题框里的标题”), MB_OK);
该函数一般都如此调用,第四个参数都是 MB_***,以 MB 开头的常量。
(函数的有些参数设置为 NULL, 或者 0 效果是一样的,因为大多数编译器把 NULL 宏定义为 0)
(注意:遇到程序在弄懂之后一定要自己去敲,一定要自己去敲,一定要自己去敲)
(注意:遇到程序在弄懂之后一定要自己去敲,一定要自己去敲,一定要自己去敲)
(注意:遇到程序在弄懂之后一定要自己去敲,一定要自己去敲,一定要自己去敲)
Windows API 编程入门的更多相关文章
- Mysql C语言API编程入门讲解
原文:Mysql C语言API编程入门讲解 软件开发中我们经常要访问数据库,存取数据,之前已经有网友提出让鸡啄米讲讲数据库编程的知识,本文就详细讲解如何使用Mysql的C语言API进行数据库编程. ...
- 浅谈Windows API编程
WinSDK是编程中的传统难点,个人写的WinAPI程序也不少了,其实之所以难就难在每个调用的API都包含着Windows这个操作系统的潜规则或者是windows内部的运行机制…… WinSDK是编程 ...
- Windows多线程编程入门
标签(空格分隔): Windows multithread programming 多线程 并发 编程 背景知识 在开始学习多线程编程之前,先来学习下进程和线程 进程 进程是指具有一定独立功能的程序在 ...
- Windows API编程(SDK编程)配置VS2017——出现LNK 2019错误的win32项目如何解决
最近刚入门SDK编程,在 我终于知道为什么windowsApi学的人这么少了 这篇文章中,确实发现了这样的问题,我的教程使用VS2013->Windows桌面->win32,就诞生了能使用 ...
- windows驱动编程入门(第一个程序)
1. 工具 vc6.0 WINDDK 3790.1830 Dbgview 驱动加载工具InstDrv32位/64位中文版 2. 代码 first.c /// /// @file first.c /// ...
- Windows API 编程----将错误代码转换成错误描述信息
Windows编程有时会因为调用函数而产生错误,调用GetLastError()函数可以得到错误代码.如果错误代码为0,说明没有错误:如果错误代码不为0,则说明存在错误. 而错误代码不方便编程人员或用 ...
- Windows API编程(一)完整的示范程序
## #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//回调函数; int APIEN ...
- Windows API 编程----EnumWindows()函数的用法
1. 函数原型: BOOL WINAPI EnumWindows( _In_ WNDENUMPROC lpEnumFunc, _In_ LPARAM lParam); lpEnumFunc: 应用程序 ...
- Windows API 编程-----DLL编程之禁止加载自己
和可执行文件一样,动态链接库也有自己的入口地址,如果系统或者当前进程的某个线程调用LoadLibrary函数加载或者使用FreeLibrary卸载该动态链接库的时候,会自动使用3个特定的堆栈参数跳转到 ...
随机推荐
- (2)RapidJson的详解及使用
本节主要介绍RapidJson是如何使用的. (1)RapidJson是什么 RapidJson是一个跨平台的c++的json的解析器和生成器: 相比较jsoncpp库,RapidJson ...
- windows平台:查看端口占用情况,请杀死端口对应进程PID
//查看 netstat -ano | findstr //杀死 taskkill /f /PID
- 解决ie6上碰到的css兼容问题
ie6上css碰到的坑 前两天在给一个项目做东西的时候,碰到一个有意思的项目,是需要兼容ie6,有一些碰到并且解决的问题,给大家写下来,方便大家以后碰到类似的问题哈- 喜欢的话还请点赞! 1.impo ...
- 【数据结构】Hash表
[数据结构]Hash表 Hash表也叫散列表,是一种线性数据结构.在一般情况下,可以用o(1)的时间复杂度进行数据的增删改查.在Java开发语言中,HashMap的底层就是一个散列表. 1. 什么是H ...
- 反射的应用、获取Class类实例
*准备工作: 包结构:* ======================= Person.java代码: package com.atguigu.java; public class Person { ...
- java教程系列二:Java JDK,JRE和JVM分别是什么?
多情只有春庭月,犹为离人照落花. 概述 本章主要了解JDK,JRE和JVM之间的区别.JVM是如何工作的?什么是类加载器,解释器和JIT编译器.还有一些面试问题. Java程序执行过程 在深入了解Ja ...
- MySQL性能优化以及常用命令
1.将查询操作SELECT中WHERE条件后面和排序字段建立索引 2.按需查询,需要哪个字段就查哪个字段,禁止使用"SELECT * " 3.数据库引擎最好选用InnoDB,少用M ...
- jenkins自动化部署项目2 --插件的选择和安装
一.安装插件: 我选择的安装建议的插件,也可以自定义安装自己想要的插件,在不敢保证自己确定要用的插件是完全正确的情况下建议按推荐安装 我理解的jenkins+tomcat完成自动化部署maven项目需 ...
- Ubuntu18.04安装PHP7.3
因为近期需要做毕业设计,需要用到Linux系统,在此分享一下在Linux-Ubuntu系统下安装PHP环境的一小点知识,如有偏差错误的,请各位学友多多指教哈! sudo apt-get install ...
- flask+layui+echarts实现前端动态图展示数据
效果图: 该效果主要实现一个table展示数据,并在下方生成一个折线图. 实现方式: 1.首先需要对表格进行一个数据加载,这里用到了layui的table.render,具体用法可以参考 https: ...