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;
}



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



相关文章
|
1月前
|
存储 C++ UED
【实战指南】4步实现C++插件化编程,轻松实现功能定制与扩展
本文介绍了如何通过四步实现C++插件化编程,实现功能定制与扩展。主要内容包括引言、概述、需求分析、设计方案、详细设计、验证和总结。通过动态加载功能模块,实现软件的高度灵活性和可扩展性,支持快速定制和市场变化响应。具体步骤涉及配置文件构建、模块编译、动态库入口实现和主程序加载。验证部分展示了模块加载成功的日志和配置信息。总结中强调了插件化编程的优势及其在多个方面的应用。
241 63
|
1月前
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
50 2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
|
1月前
|
安全 程序员 编译器
【实战经验】17个C++编程常见错误及其解决方案
想必不少程序员都有类似的经历:辛苦敲完项目代码,内心满是对作品品质的自信,然而当静态扫描工具登场时,却揭示出诸多隐藏的警告问题。为了让自己的编程之路更加顺畅,也为了持续精进技艺,我想借此机会汇总分享那些常被我们无意间忽视却又导致警告的编程小细节,以此作为对未来的自我警示和提升。
101 4
|
1月前
|
安全 程序员 编译器
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
81 11
|
1月前
|
存储 C++ 容器
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器1
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
54 5
|
1月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
41 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
1月前
|
算法 编译器 C++
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
79 2
|
1月前
|
存储 编译器 C++
【C++篇】引领C++模板初体验:泛型编程的力量与妙用
【C++篇】引领C++模板初体验:泛型编程的力量与妙用
38 2
|
1月前
|
程序员 C++
C++编程:While与For循环的流程控制全解析
总结而言,`while`循环和 `for`循环各有千秋,它们在C++编程中扮演着重要的角色。选择哪一种循环结构应根据具体的应用场景、循环逻辑的复杂性以及个人的编程风格偏好来决定。理解这些循环结构的内在机制和它们之间的差异,对于编写高效、易于维护的代码至关重要。
52 1
|
2月前
|
网络协议 API Windows
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾