Windows编程基础

news2025/1/16 1:39:36

Windows编程基础

Unit1应用程序分类

  • 控制台程序:Console
    • Dos程序,本身没有窗口,通过windows Dos窗口执行
  • 窗口程序
    • 拥有自己的窗口,可以与用户交互
  • 库程序
    • 存放代码、数据的程序,执行文件可以从中取出代码执行和获取数据
    • 静态库程序:扩展名LIB,在编译链接程序时,将代码放入到执行文件中
    • 动态库程序:扩展名DLL,在执行文件执行时从中获取代码

应用程序对比

  • 入口函数
    • 控制台程序-main
    • 窗口程序-winMain
    • 动态库程序-DllMain
    • 静态库程序-无入口函数
  • 文件存在方式
    • 控制台程序、窗口程序-EXE文件
    • 动态库程序-DLL文件
    • 静态库程序-LIB文件

Unit2开发工具和库

01编译工具

  • 编译器CL.EXE,将源码编译成目标代码.obj

  • 链接器LINK.EXE,将目标代码、库链接生成最终文件

  • 资源编译器RC.EXE,(.rc)将资源编译,最终通过链接器存入最终文件

  • 工具所在路径:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin

  • 注意:将上面文件夹中的vcvars32.bat文件拷贝到项目的所在目录下,要不然使用不了上面的工具进行操作

在这里插入图片描述
在这里插入图片描述

02库和头文件

  • Windows库

    • kernel32.dll:提供了核心的API,例如进程、线程、内存管理
    • user32.dll:提供了窗口、消息等API
    • gdi32.dll:绘图相关的API
    • 路径:C:\Windows\System32
  • 头文件

    • windows.h:所有windows头文件的集合
    • windef.h:windows数据类型
    • winbase.h:kernel32的API
    • wingdi.h:gdi32的API
    • winuser.h:user32的API
    • winnt.h:UNICODE字符集支持
    • C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include

03相关函数

int WINAPI WinMain(
	HINSTANCE hInstance,//当前程序的实例句柄
	HINSTANCE hPrevInstance,//当前程序前一个实例句柄
	LPSTR lpCmdLine,//命令行参数字符串
	int nCmdShow//窗口的显示方式
);

int MessageBox(
	HWND hWnd,//父窗口句柄
	LPCTSTR lpText,//显示在信息框中的文字
	LPCTSTR lpCaption,//显示在信息框中的文字
	UINT uType//消息框中的按钮、图标显示类型
);//返回点击的按钮ID

04程序编译过程

  • 编译环境准备:vcvars32.bat
  • 编译程序 :CL
    • CL.EXE -c xxx.c
  • 链接程序:LINK
    • LINK.EXE xxx.obj xxx.lib
  • 执行

05手动创建一个窗口程序

  • 项目名为Hello
    在这里插入图片描述

  • 用记事本新建Hello.txt文件,写入以下代码

int WinMain(HINSTANCE hIns,HINSTANCE hPreIns,LPSTR lpCmdLine,int nCmdShow)
{
	MessageBox(NULL, "hello world", "infomation", MB_YESNOCANCEL|MB_ICONERROR);
	return 0;
}
  • 修改txt文件编程c文件,Hello.txt变为Hello.c
  • 在doc窗口下用命令进行汇编、编译、链接
    • 用可能遇到命令不能用的情况,要将在终端运行vcvars32.bat文件
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

在这里插入图片描述

06程序资源编译过程

  • 编写资源文件:.rc资源脚本文件
  • 编译rc文件RC.EXE
  • 将资源链接到程序中LINK.EXE

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

07编译过程图解

在这里插入图片描述

Unit03第一个Windows窗口

01窗口创建过程

  • 定义WinMain函数
  • 定义窗口处理函数(自定义,处理消息)
  • 注册窗口类(向操作系统写入一些数据)
  • 创建窗口(内存中创建窗口)
  • 显示窗口(绘制窗口的图像)
  • 消息循环(获取/翻译/派发消息)
  • 消息处理

02代码示例

#include <windows.h>

//窗口处理函数(自定义,处理函数)
LRESULT CALLBACK WndProc(HWND hWnd,UINT msgID,WPARAM wParam,LPARAM lParam)
{
	return DefWindowProc(hWnd, msgID, wParam, lParam);
}
//入口函数
int CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns,LPSTR lpCmdLine,int nCmdShow)
{
	//注册窗口类
	WNDCLASS wc = {0};
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.hCursor = NULL;
	wc.hIcon = NULL;
	wc.hInstance = hIns;
	wc.lpfnWndProc = WndProc;
	wc.lpszClassName = "Main";
	wc.lpszMenuName = NULL;
	wc.style = CS_HREDRAW|CS_VREDRAW;
	RegisterClass(&wc);//将以上所有赋值全部写入操作系统
	//在内存创建窗口
	HWND hWnd = CreateWindow("Main","window",WS_OVERLAPPEDWINDOW,100,100,500,500,NULL,NULL,hIns,NULL);
	//显示窗口
	ShowWindow(hWnd,SW_SHOW);
	UpdateWindow(hWnd);
	//消息循环
	MSG nMsg = {0};
	while(GetMessage(&nMsg,NULL,0,0))
	{
		TranslateMessage(&nMsg);
		DispatchMessage(&nMsg);//将消息交给窗口处理函数来处理
	}
	return 0;
}

Unit04字符编码

01编码历史背景

  • ASC(7位)
  • ASCII(8位)
  • DBCS(单双字节混合编码,英文字母单字节,中文双字节)
  • UNICODE(双子编码)

02DBCS和UNICODE码

  • DBCS字符编码
A   我     是      程      序     员
01 0203 0405 0607 0809 0A0B
但是解析时可能是
01 0203 0405 0607 0809 0A0B
0102 0304 0506 0708 090A 0B
  • UNICODE编码(UTF-16)
A   我     是      程      序     员
01 0203 0405 0607 0809 0A0B
不存在解析的问题

03宽字节字符

  • wchar_t每个字符占2个字节
    char每个字符占1个字节
    w_char_t实际是unsigned short类型,定义时需增加"L",通知编译器按照双字节编码字符串,采用UNICODE编码
  • 需要使用支持wchar_t函数操作宽字节字符串,例如:
wchar_t* pwszText = L"Hello world";
wprintf(L"%s\n", pwszText);
#include <Windows.h>
#include <stdio.h>

void C_char(){
	char* pszText = "Hello char";
	printf("%s\n", pszText);
}

void W_char(){
	wchar_t* pszText = L"hello wchar";
	int len = wcslen(pszText);
	wprintf(L"%s %d\n", pszText, len);
}
int main(){
	C_char();
	W_char();
	getchar();
	return 0;
}

04TCHAR

#ifdef UNICODE
	typedef wchar_t TCHAR;
	# define __TEXT(quote)L##quote
#else
	typedef char TCHAR;
	#define __TEXT(quote)quote
#endif
#define UNICODE
#include <Windows.h>
#include <stdio.h>

void C_char(){
	char* pszText = "Hello char";
	printf("%s\n", pszText);
}

void W_char(){
	wchar_t* pszText = L"hello wchar";
	int len = wcslen(pszText);
	wprintf(L"%s %d\n", pszText, len);
}

void T_char(){
	TCHAR* pszText = __TEXT("hello txt");//char* pszText = "Hello txt";/wchar_t* pszText = L"hello txt";
#ifdef UNICODE
	wprintf(L"%s\n", pszText);
#else
	printf("single:%s\n", pszText);
#endif
}
int main(){
	C_char();
	W_char();
	T_char();
	getchar();
	return 0;
}

05打印UNICODE字符

wprintf对UNICODE字符打印支持不完善,在Windows下使用WriteConsoleAPI打印UNICODE字符GetStdHandle

#define UNICODE
#include <Windows.h>
#include <stdio.h>

void C_char(){
	char* pszText = "Hello char";
	printf("%s\n", pszText);
}

void W_char(){
	wchar_t* pszText = L"hello wchar";
	int len = wcslen(pszText);
	wprintf(L"%s %d\n", pszText, len);
}

void T_char(){
	TCHAR* pszText = __TEXT("hello txt");//char* pszText = "Hello txt";/wchar_t* pszText = L"hello txt";
#ifdef UNICODE
	wprintf(L"%s\n", pszText);
#else
	printf("single:%s\n", pszText);
#endif
}

void printUnicode(){
	wchar_t* pszText = L"今天在下雨";
	//wprintf(L"%s\n", pszText);//打印出来的是乱码
	//获取标准输出句柄
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	WriteConsole(hOut,pszText, wcslen(pszText), NULL, NULL);
}
int main(){
	C_char();
	W_char();
	T_char();

	printUnicode();
	getchar();
	return 0;
}

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/415677.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL】索引事务

摄影分享~ 文章目录索引概念使用场景使用事务概念使用事务的特性索引 概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。 通过目录&#xff0c;就可以…

如何使用数字示波器

本文介绍以鼎阳SIGLENT SDS1122E数字示波器为例。 带了一根电源线&#xff1b;两根信号线&#xff0c;每根信号线都有几个小配件&#xff0c;如下所示&#xff1a; 使用概述 我们都知道万用表&#xff08;又称欧姆表&#xff09;是工程师最常用的调试电路的工具&#xff0c;但万…

技术+商业“双轮”驱动,量旋科技加速推进全方位的量子计算解决方案

【中国&#xff0c;深圳】4月14日&#xff0c;在第三个“世界量子日”&#xff0c;以“‘双轮’驱动 加速未来”为主题的量旋科技2023战略发布会在线上举办。 本次发布会&#xff0c;量旋科技全线升级了三大业务线产品&#xff1a;其中重点布局的超导量子计算体系产品&#xf…

监控系统 Prometheus 的说明

一、Prometheus 是什么&#xff1f; ELK Stack 日志收集和检索平台想必大家应该比较熟悉&#xff0c;Elasticsearch Filebeat Logstash Kibana。 而 Prometheus 就相当于一整个 ELK&#xff0c;但是它其实并不是适合存储大量日志&#xff0c;也不适合长期存储&#xff08;默…

【AI绘图学习笔记】transformer

台大李宏毅21年机器学习课程 self-attention和transformer 文章目录Seq2seq实现原理EncoderDecoderAutoregressive自回归解码器Non-Autoregressive非自回归解码器Corss-attention总结TrainingtrickCopy MechanismGuided AttentionBeam Search强化学习&#xff08;Reinforcement…

AVL树,红黑树,红黑树封装map和set

文章目录AVL树AVL树的实现AVL树的节点AVL树的平衡因子AVL树的插入AVL树的旋转左单旋右单旋左右正旋右左正旋中序遍历打印节点判断子树是否平衡整体代码验证代码红黑树概念性质&#xff08;规则&#xff09;红黑树的实现结点定义插入parent在grandparent的左情况一&#xff1a;u…

登录认证功能的统一拦截技术(拦截器)

目录 1.说明 2.使用方法 (1) 定义拦截器 (2)注册配置拦截器 (3)示例&#xff1a; 3.interceptor详细说明 (1)拦截路径 (2)执行流程 (3)过滤器和拦截器的区别 4.登录校验的拦截器实现 5.全局异常处理(补充说明) 1.说明 拦截器是一种动态拦截方法调用的机制&#xff0…

3年功能测试被辞,待业3个月,2023不会自动化测试真的找不到工作吗?

前言 来自一位粉丝的投稿&#xff0c;在测试行业已近打拼了3年&#xff0c;一直兢兢业业&#xff0c;前不久被公司以人员优化的理由辞退&#xff0c;到现在已近过去了3个月还没有找到测试工作&#xff0c;让她很焦虑&#xff0c;我通过和她的交流才发现她最大的问题就是技术方…

从零开始学习Python中UnitTest测试框架:实现高效自动化测试流程

目录&#xff1a;导读 引言 1.白盒测试原理 2.自动化测试用例编写 3.UnitTest测试框架 3.1UnitTest组件&#xff08;测试固件&#xff09; 3.1.2测试套件 3.1.3测试运行 3.1.4测试断言 3.1.5测试结果 3.2unittest测试固件的详解 3.2.1测试固件每次均执行 3.2.2测试…

【JavaEE】CAS机制(比较并交换)

哈喽&#xff0c;大家好~我是你们的老朋友保护小周ღ&#xff0c;本期为大家带来的是 CAS (compare and swap) 比较并交换&#xff0c;CAS 是物理层次支持程序的原子操作&#xff0c;CAS 是一种完全不同于 synchronized 锁保证多线程安全问题的机制&#xff0c;可以用来进行无锁…

Java基础——Stream流

&#xff08;1&#xff09;Stream流概述&#xff1a; 1.什么是Stream流&#xff1f; 用于简化集合和数组操作的API。结合了Lambda表达式。方便操作集合/数组的手段&#xff08;集合/数组才是开发的目的&#xff09;。2.体验Stream流的作用&#xff1a; import java.util.Arr…

高并发场景I/O优化

大家好&#xff0c;我是易安&#xff01; Java I/O是一个众所周知的概念。它常被用于读写文件、实现Socket信息传输等操作&#xff0c;这些都是系统中最常见的与I/O相关的任务。 我们都了解&#xff0c;I/O的速度相较于内存速度较慢。在当前大数据时代背景下&#xff0c;I/O性能…

java足球体育新闻资讯发布系统ssh

为 本系统的功能目标分为以下几个模块&#xff1a;用户管理模块、足球新闻类别管理模块、足球新闻管理模块、留言管理模块和前台足球新闻浏览模块。 系统功能模块的划分&#xff0c;是在需求分析基础上进行的&#xff0c;是把具有复杂功能的系统通过设计分解为具有基本独立&…

【并发编程】AQS源码

ReentrantLock 互斥锁,可重入 AQS是可以支持互斥锁和共享锁的&#xff0c;这里只分析互斥锁的源码 加锁 公平锁和非公平锁 公平锁 final void lock() {acquire(1); //抢占1把锁.}// AQS里面的方法public final void acquire(int arg) { if (!tryAcquire(arg) &&acq…

MySQL:事务、索引、用户管理、备份、数据库设计(三大范式)

文章目录Day 03&#xff1a;一、事务1. 原则2. 测试实现二、索引1. 分类2. 创建索引3. 分析 sql 执行的状况4. 测试索引5. 索引原则三、数据库用户管理四、备份五、规范数据库设计1. 三大范式注意&#xff1a;Day 03&#xff1a; 一、事务 事务(transaction)&#xff1a;要么…

含光热电站、有机有机朗肯循环、P2G的综合能源优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

『pyqt5 从0基础开始项目实战』04. 表格数据的初始化(保姆级图文)

目录导包和框架代码准备json数据文件表格数据接入1. 准备文件路径2. 读取json数据3. 将得到的json数据放入table设置单元格不可修改把数据中的数字转为映射内容完整代码总结欢迎关注 『pyqt5 从0基础开始项目实战』 专栏&#xff0c;持续更新中 欢迎关注 『pyqt5 从0基础开始项…

TiDB实战篇-备份恢复策略

简介 简要说明TiDB备份恢复策略。 备份的类型 热备 TiDB使用MVCC机制实现设备的。 冷备 需要停机备份。 温备 备份的时候只能读不能够写。 备份技术 逻辑备份 物理备份 物理备份的限制 基于复制的备份 复制恢复是最快的。&#xff08;TiDB CDC,TiDB Binlog&#xff…

【C语言】函数详解(嵌套调用和链式访问、声明及定义、递归)

简单不先于复杂&#xff0c;而是在复杂之后。 目录 1.函数的嵌套调用和链式访问 1.1 嵌套调用 1.2 链式访问 2. 函数的声明和定义 2.1 函数声明 2.2 函数定义 3. 函数递归 3.1 什么是递归&#xff1f; 3.2 递归的两个必要条件 3.2.1 练习1&#xff08;需要画图…

Spring Security实战(三)—— 自动登录与注销登录

目录 一、实现自动登录 1. 散列加密方案 2. 持久化令牌方案 二、注销登录 一、实现自动登录 自动登录是将用户的登录信息保存在用户浏览器的cookie中&#xff0c;当用户下次访问时&#xff0c;自动实现校验并建立登录态的一种机制。 Spring Security 提供了两种非常好的令牌&a…