C++windows内核编程笔记day01_day02

简介: windows编程介绍、windows 库和头文件介绍 exe文件:.exe,可执行文件 静态库文件:*.lib,调用时,源代码嵌入到调用位置 动态库文件:*.

windows编程介绍、windows 库和头文件介绍

exe文件:.exe,可执行文件
静态库文件:*.lib,调用时,源代码嵌入到调用位置
动态库文件:*.dll,调用时,函数地址被传入

--写编译软件,要懂编译原理.
windows 库和头文件
kernel32.dll-提供了核心的API,例如进程、线程、内存管理等
user32.dll-提供了窗口消息等API
gdi32.dll-绘图相关的API
windows.h-所有windows头文件的集合
windef.h-windows数据类型
winbase.h-kernel32的API
wingdi.h-gdi32的API
winuser.h-user32的API
winnt.h-UNICODE字符集支持

命令行编译:
cl.exe /c *.cpp  -编译成*.obj 文件
                 手写.rc文件,格式:100 ICON *.ico
rc.exe  *.rc     (将资源编译成.res文件)

link.exe  *.obj *.res user32.lib    -链接成*.exe文件


makefile 文件编译,可以进行依赖,先编译依赖项
1、编辑:***.mak,写入内容示例:
main:clean
    cl.exe /c ***.cpp
    rc.exe ***.rc
    link.exe ***.obj ***.res user32.lib
clean:
    del * obj
    del *.res
    del *.exe
2、执行***.mak进行编译链接:
nmake ***.mak
3、执行删除中间文件命令
nmake /f ***.mak clean

编写窗口程序步骤:
1、定义WinMain函数
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    g_hinstance=hInstance;
     // TODO: Place code here.
    if(Register("main",WinProc)==0)
    {
        MessageBox(NULL,"注册失败","提示",MB_OK);
        return 0;
    }
    HWND hwnd= CreateMain("main","pro1");
    Display(hwnd);
    MSGdeal();
    return 0;
}
2、定义窗口处理函数  WindowProc
LRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
    switch(msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
    return DefWindowProc(hwnd,msg,wparam,lparam);
}
3、注册窗口类 RegisterClass
BOOL Register(LPSTR lpClassName,WNDPROC wndproc)
{
    WNDCLASSEX wce={0};
    wce.cbSize=sizeof(wce);
    wce.cbClsExtra=0;
    wce.cbWndExtra=0;
    wce.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
    wce.hCursor=NULL;
    wce.hIcon=NULL;
    wce.hIconSm=NULL;
    wce.hInstance=g_hinstance;
    wce.lpfnWndProc=wndproc;
    wce.lpszClassName=lpClassName;
    wce.lpszMenuName=NULL;
    wce.style=CS_HREDRAW|CS_VREDRAW;
    ATOM atom= RegisterClassEx(&wce);
    if(atom==0){
        MessageBox(NULL,"注册失败","info",MB_OK);
        return FALSE;
    }
    return TRUE;
}
4、创建窗口 CreateWindow
HWND CreateMain(LPSTR lpClassName,LPSTR lpWndName)
{
    HWND hwnd=CreateWindowEx(0,lpClassName,lpWndName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
        CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,g_hinstance,NULL);
    return hwnd;
}

5、显示窗口 ShowWindow/UpdateWindow
void Display(HWND hwnd)
{
    ShowWindow(hwnd,SW_SHOW);
    UpdateWindow(hwnd);
}
6、消息循环 GetMessage/TranslateMessage/DispatchMessage
void MSGdeal()
{
    MSG msg={0};
    //GetMessage 第二个参数为句柄,限制获取消息的范围,为空则不限制
    while(GetMessage(&msg,NULL,0,0)){
        TranslateMessage(&msg);//翻译消息
        DispatchMessage(&msg);//派发给 WinProc 处理消息
    }
}
7、消息处理,在WinProc 中switch-case 处理不同消息


代码示例:

新建-工程-选择“win32 application”-输入 工程名-选择“一个简单的win32程序” -点击“完成”


修改主要CPP文件:

// win32app.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include <stdio.h>
HINSTANCE g_hinstance=0;//全局句柄
HANDLE g_houtput=0;
void OnCreate(HWND hwnd,LPARAM lparam)
{
// 	CREATESTRUCT *pcs=(CREATESTRUCT*)lparam;
// 	char * txt=(char *)pcs->lpCreateParams;
// 	MessageBox(NULL,txt,"info",MB_OK);
	// 		char txt[200]={0};
	// 		ScreenToClient(hwnd,&pt);
	// 		sprintf(txt,"%d,%d ; %d,%d,%d,%d\n",pt.x,pt.y,rc.top,rc.left,rc.right,rc.bottom);
	// 		
// 		WriteConsole(g_houtput,txt,strlen(txt),NULL,NULL);
}
void oncommand(HWND hwnd,WPARAM wparam,LPARAM lparam)
{
	UINT id=LOWORD(wparam);
	int result=0;
	HWND dlg=0;
	switch(id)
	{
	case 0:
		break;
	}
}
//回调函数
LRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
	switch(msg)
	{
	case WM_SYSCOMMAND:
		if(wparam==SC_CLOSE){
			/*
			int ret=MessageBox(NULL,"是否退出","info",MB_YESNO);
			if(ret==IDYES){
				//下面代码会自动关闭和销毁
				//PostQuitMessage(0);
			}
			else return 0;//不执行下面代码
			*/
		}
		break;
		//在创建窗口之后还未显示的时候
	case WM_CREATE:
		OnCreate(hwnd,lparam);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	case WM_COMMAND:
		oncommand(hwnd,wparam,lparam);
		break;
	}
	return DefWindowProc(hwnd,msg,wparam,lparam);
}
//注册窗口类
BOOL Register(LPSTR lpClassName,WNDPROC wndproc)
{
	WNDCLASSEX wce={0};
	wce.cbSize=sizeof(wce);
	wce.cbClsExtra=200;
	wce.cbWndExtra=200;
	wce.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
	wce.hCursor=NULL;
	wce.hIcon=NULL;
	wce.hIconSm=NULL;
	wce.hInstance=g_hinstance;
	wce.lpfnWndProc=wndproc;
	wce.lpszClassName=lpClassName;
	wce.lpszMenuName=NULL;
	wce.style=CS_HREDRAW|CS_VREDRAW;
	ATOM atom= RegisterClassEx(&wce);
	if(atom==0){
		MessageBox(NULL,"注册失败","info",MB_OK);
		return FALSE;
	}
	return TRUE;
}
//创建窗口
HWND CreateMain(LPSTR lpClassName,LPSTR lpWndName)
{
	HWND hwnd=CreateWindowEx(0,lpClassName,lpWndName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
		CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,g_hinstance,"hello create");
	return hwnd;
}
//创建子窗口
HWND CreateChild(HWND phwnd,LPSTR lpClassName,LPSTR lpWndName)
{
	if(Register(lpClassName,DefWindowProc)==0)
	{
		MessageBox(phwnd,"创建子窗口失败","info",MB_OK);
		return NULL;
	}
	//子窗口风格,都要 WS_CHILD|WS_VISIBLE
	HWND hwnd=CreateWindowEx(0,lpClassName,lpWndName,WS_CHILD|WS_VISIBLE|WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
		200,200,phwnd,NULL,g_hinstance,NULL);
	return hwnd;
}
//显示窗口
void Display(HWND hwnd)
{
	ShowWindow(hwnd,SW_SHOW);
	UpdateWindow(hwnd);
}
//处理消息
void MSGdeal()
{
	MSG msg={0};
	while(GetMessage(&msg,NULL,0,0)){
		TranslateMessage(&msg);//翻译消息 
		DispatchMessage(&msg);//派发给 WinProc 处理消息 
	}
}
void SetExtra(HWND hwnd)
{
	SetClassLong(hwnd,0,301);
	SetWindowLong(hwnd,0,401);
}
void GetExtra(HWND hwnd)
{
	long nc= GetClassLong(hwnd,0);
	long nw=GetWindowLong(hwnd,0);
	char txt[200]={0};
	sprintf(txt,"%d,%d",nc,nw);
	MessageBox(NULL,txt,"info",MB_OK);
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	AllocConsole();//调试程序方法
	g_houtput=GetStdHandle(STD_OUTPUT_HANDLE);
	g_hinstance=hInstance;
 	// TODO: Place code here.
	//SysReg();
	//AppReg();
	if(Register("main",WinProc)==0)
	{
		MessageBox(NULL,"注册失败","提示",MB_OK);
		return 0;
	}
	HWND hwnd= CreateMain("main","pro1");
	//HWND hchild=CreateChild(hwnd,"child1","child1");//创建子窗口
	//HWND hchild2=CreateChild(hwnd,"child2","child2");
	
	Display(hwnd);
	//MoveWindow(hchild,300,200,200,200,TRUE);
	//MoveWindow(hchild2,500,200,200,200,TRUE);
	//SetExtra(hwnd);
	//GetExtra(hwnd);
	MSGdeal();
	return 0;
}



//编译运行,会出来一个窗口程序,但内容是空白的。



相关文章
|
11月前
|
Ubuntu API C++
C++标准库、Windows API及Ubuntu API的综合应用
总之,C++标准库、Windows API和Ubuntu API的综合应用是一项挑战性较大的任务,需要开发者具备跨平台编程的深入知识和丰富经验。通过合理的架构设计和有效的工具选择,可以在不同的操作系统平台上高效地开发和部署应用程序。
386 11
|
安全 程序员 编译器
【实战经验】17个C++编程常见错误及其解决方案
想必不少程序员都有类似的经历:辛苦敲完项目代码,内心满是对作品品质的自信,然而当静态扫描工具登场时,却揭示出诸多隐藏的警告问题。为了让自己的编程之路更加顺畅,也为了持续精进技艺,我想借此机会汇总分享那些常被我们无意间忽视却又导致警告的编程小细节,以此作为对未来的自我警示和提升。
1824 126
|
存储 C++ UED
【实战指南】4步实现C++插件化编程,轻松实现功能定制与扩展
本文介绍了如何通过四步实现C++插件化编程,实现功能定制与扩展。主要内容包括引言、概述、需求分析、设计方案、详细设计、验证和总结。通过动态加载功能模块,实现软件的高度灵活性和可扩展性,支持快速定制和市场变化响应。具体步骤涉及配置文件构建、模块编译、动态库入口实现和主程序加载。验证部分展示了模块加载成功的日志和配置信息。总结中强调了插件化编程的优势及其在多个方面的应用。
1615 172
|
Web App开发 人工智能 JSON
Windows版来啦!Qwen3+MCPs,用AI自动发布小红书图文/视频笔记!
上一篇用 Qwen3+MCPs实现AI自动发小红书的最佳实践 有超多小伙伴关注,同时也排队在蹲Windows版本的教程。
2519 1
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
1096 1
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
存储 机器学习/深度学习 编译器
【C++终极篇】C++11:编程新纪元的神秘力量揭秘
【C++终极篇】C++11:编程新纪元的神秘力量揭秘
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
427 9
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
|
监控 Ubuntu Linux
视频监控笔记(五):Ubuntu和windows时区同步问题-your clock is behind
这篇文章介绍了如何在Ubuntu和Windows系统中通过设置相同的时区并使用ntp服务来解决时间同步问题。
631 4
视频监控笔记(五):Ubuntu和windows时区同步问题-your clock is behind
|
存储 算法 C++
深入浅出 C++ STL:解锁高效编程的秘密武器
C++ 标准模板库(STL)是现代 C++ 的核心部分之一,为开发者提供了丰富的预定义数据结构和算法,极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C++ 开发者来说至关重要。以下是对 STL 的详细介绍,涵盖其基础知识、发展历史、核心组件、重要性和学习方法。
|
存储 安全 算法
深入理解C++模板编程:从基础到进阶
在C++编程中,模板是实现泛型编程的关键工具。模板使得代码能够适用于不同的数据类型,极大地提升了代码复用性、灵活性和可维护性。本文将深入探讨模板编程的基础知识,包括函数模板和类模板的定义、使用、以及它们的实例化和匹配规则。