标签:unsigned 主线程 创建 directory 资源 moved 属性 download 启动过程
一,CPU的保护模式和windows操作系统
[x] windows 是多任务实现
[x] 虚拟内存和 各个进程的地址空间安排:2G系统空间,2G用户空间,2G用户空间是各个进程私有的,很少被其他应用打断,保证系统稳定
[x] 内核模式和用户模式:虽然用户模式下是独立4G空间,但是内核模式的系统和驱动共用一个2G空间;内核空间的数据只有在特定的权限下才能访问
[x] 当应用程序调用系统函数比如ReadFile,应用程序会从用户模式进入内核模式去执行;
因为访问系统内部数据,必须运行在内核模式下
二,内核对象
三,对象句柄
原则上,内核对象的句柄仅对当前进程有效;当然也有手段多进程共用一个内核对象
四,应用程序启动流程
应用程序的启动过程就是应用程序的创建过程
#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;
}
微软使用typedef关键字,为很多常用的C/C++类型均定义了别名,这样一来,要解决源代码移植问题,只需在目标平台上定义相同的一套类型别名,
即可解决大部分问题,很是方便,这其实也是为程序的扩展性考虑的。
DWORD 实质上就是unsigned long数据类型,32位无符号整型。
HANDLE 类型实质上是void, HANDLE定义为:
typedof PVOID HANDLE;
HANDLE 实际上就是一个PVOID,那PVOID又是什么呢?
typeof void* PVOID;
PVOID 就是指向void的指针
#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;
}
[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);
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);
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);
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);
}
}
?
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);
}
标签:unsigned 主线程 创建 directory 资源 moved 属性 download 启动过程
原文地址:https://www.cnblogs.com/chance0x1/p/13060295.html