Windows编程

Windows 程序原理

  • 一,CPU的保护模式和windows操作系统

    • [x] windows 是多任务实现

    • [x] 虚拟内存和 各个进程的地址空间安排:2G系统空间,2G用户空间,2G用户空间是各个进程私有的,很少被其他应用打断,保证系统稳定

    • [x] 内核模式和用户模式:虽然用户模式下是独立4G空间,但是内核模式的系统和驱动共用一个2G空间;内核空间的数据只有在特定的权限下才能访问

    • [x] 当应用程序调用系统函数比如ReadFile,应用程序会从用户模式进入内核模式去执行;

      因为访问系统内部数据,必须运行在内核模式下

  • 二,内核对象

    • [x] 内核对象是系统提供的用户模式下代码与内核模式下代码交互的基本接口
    • [ ] 内核对象是内核分配的内存,只能在内核模式下运行,内核对象记录的数据在整个系统只有一份,他们也称为系统资源
    • [ ] 内核对象和普通对象的最大区别,其数据结构是隐藏的,必须调用对象服务才能使用修改。
  • 三,对象句柄

    原则上,内核对象的句柄仅对当前进程有效;当然也有手段多进程共用一个内核对象

  • 四,应用程序启动流程

    应用程序的启动过程就是应用程序的创建过程

    • 操作系统通过CreateProcess 创建新的进程,初始化引用计数,创建虚拟地址空间,加载应用程序运行时所需的代码和数据
    • 创建主线程。主线程执行C/C++运行期启动代码开始运行,然后调用main函数

初始windows编程

1.1创建Win32 Windows应用程序

Win32 Project 创建

1.2认识入口函数

#include <tchar.h>#include <windows.h>int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd){ MessageBox(NULL, _T("这是第一个程序"), _T("标题"), MB_YESNOCANCEL | MB_DEFBUTTON2); return 0;}

1.3Windows常见数据类型

【Windows核心编程】Windows常见数据类型

微软使用typedef关键字,为很多常用的C/C++类型均定义了别名,这样一来,要解决源代码移植问题,只需在目标平台上定义相同的一套类型别名,

即可解决大部分问题,很是方便,这其实也是为程序的扩展性考虑的。

DWORD 实质上就是unsigned long数据类型,32位无符号整型。HANDLE 类型实质上是void, HANDLE定义为:typedof PVOID HANDLE;HANDLE 实际上就是一个PVOID,那PVOID又是什么呢?typeof void* PVOID; PVOID 就是指向void的指针

1.4 Windows API 调用,盘2个简单的API

1.4.1 URLDownloadToFile

【URLDownloadToFile API档案】

#include <windows.h>#include <tchar.h>#pragma comment(lib, "urlmon.lib")//入口点函数int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){ MessageBox(NULL, _T("这是第一个程序"), _T("标题"), MB_YESNOCANCEL | MB_DEFBUTTON2); //指定网址文件下载到本地文件 HRESULT herur=URLDownloadToFile(NULL, _T("https://s.cctry.com/images/eagle2.png"), _T("D:\\123.png"), 0,NULL); if (herur == S_OK) { MessageBox(NULL, _T("it is done"), _T("DOWNLOAD"), NULL); } else { MessageBox(NULL, _T("it is not done"), _T("DOWNLOAD"), NULL); } //自动执行文件 return 0;}

1.4.2 ShellExecuteEx

[ShellExecuteEx API档案](https://www.cnblogs.com/blogpro/p/11343975.html)

打开图片

 SHELLEXECUTEINFO sei; ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));//使用前最好清空 sei.cbSize = sizeof(SHELLEXECUTEINFO);//管理员权限执行cmd,最基本的使用与 ShellExecute 类似 sei.lpFile = _T("D:\\123.png"); sei.nShow = SW_SHOW; ShellExecuteEx(&sei);

打开系统的 cmd

 SHELLEXECUTEINFO sei; ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));//使用前最好清空 sei.cbSize = sizeof(SHELLEXECUTEINFO);//管理员权限执行cmd,最基本的使用与 ShellExecute 类似 sei.lpFile = _T("cmd.exe"); sei.nShow = SW_SHOW; sei.lpVerb = _T("runas"); ShellExecuteEx(&sei);

打开网页

 SHELLEXECUTEINFO sei; ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));//使用前最好清空 sei.cbSize = sizeof(SHELLEXECUTEINFO);//管理员权限执行cmd,最基本的使用与 ShellExecute 类似 sei.lpFile = _T("www.baidu.com"); sei.nShow = SW_SHOW; ShellExecuteEx(&sei);

打开QQ

 SHELLEXECUTEINFO sei; ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));//使用前最好清空 sei.cbSize = sizeof(SHELLEXECUTEINFO);//管理员权限执行cmd,最基本的使用与 ShellExecute 类似 sei.lpFile = _T("F:\\应用程序工作目录\\QQ\\Bin\\QQScLauncher.exe"); sei.nShow = SW_SHOW; ShellExecuteEx(&sei);

1.5错误处理

 BOOL sucessDelete= DeleteFile(_T("D:\\123.txt")); if (sucessDelete) { MessageBox(NULL, _T("删除成功"), _T("提示"), NULL); } else { DWORD error = GetLastError(); if(error==ERROR_FILE_NOT_FOUND) { MessageBox(NULL, _T("文件不存在"), _T("提示"), NULL); } else { MessageBox(NULL, _T("删除失败"), _T("提示"), NULL); } }

1.6文件操作

1.6.1 文件删除 复制与重命名

删除文件

?

 BOOL sucessDelete= DeleteFile(_T("D:\\123.txt")); if (sucessDelete) { MessageBox(NULL, _T("删除成功"), _T("提示"), NULL); } else { MessageBox(NULL, _T("删除失败"), _T("提示"), NULL); } //如何使用deletefile删除一个只读属性的文件?

拷贝

 BOOL sucessCopy =CopyFile(_T("D:\\456.txt"), _T("D:\\789.txt"), FALSE); if (sucessCopy) { MessageBox(NULL, _T("拷贝成功"), _T("提示"), NULL); } else { MessageBox(NULL, _T("拷贝失败"), _T("提示"), NULL); }

重命名

//重命名、可对文件夹操作//目标文件存在,重命名失败 BOOL sucessMove = MoveFile(_T("D:\\789.txt"), _T("D:\\12789.txt")); if (sucessMove) { MessageBox(NULL, _T("move成功"), _T("提示"), NULL); } else { MessageBox(NULL, _T("move失败"), _T("提示"), NULL); } BOOL sucessMoveDirectory = MoveFile(_T("D:\\新建文件夹"), _T("D:\\1278")); if (sucessMoveDirectory) { MessageBox(NULL, _T("move文件夹成功"), _T("提示"), NULL); } else { MessageBox(NULL, _T("move文件夹失败"), _T("提示"), NULL); }

相关文章