C/C++ Windows 程序設計 學習筆記(一)

多抽出一分鐘時間來學習,讓你的生命,更加精彩。

調用windows api 的 MessageBox()
參考來源:https://www.cnblogs.com/acm-bingzi/p/cMessageBox.html
代碼

#include <Windows.h>
#include <tchar.h>
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPTSTR lpCmdLine, int nShowCmd)
{
	MessageBox(NULL, _T("這是我在VC上的第一個程序"), _T("我是標題"), MB_OK);
	return 0;
}

效果
在這裏插入圖片描述

寬窄字符
參考來源:https://www.cctry.com/thread-297534-1-1.html

wchar_t
參考來源:https://blog.csdn.net/doutd_y/article/details/81745901

調用約定
參考來源:https://baike.baidu.com/item/%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A/3306047?fr=aladdin
參考來源:https://blog.csdn.net/Breeze_CAT/article/details/89470295
在這裏插入圖片描述
右鍵 點擊 轉到定義 ,可以看到
在這裏插入圖片描述
Win32 API函數絕大部分都是採用__stdcall調用約定的。WINAPI其實也只是__stdcall的一個別名而已。

__stdcall調用約定的主要特徵是:
1、參數是從右往左傳遞的,也是放在堆棧中。
2、函數的堆棧平衡操作是由被調用函數執行的。
3、在函數名的前面用下劃線修飾,在函數名的後面由@來修飾並加上棧需要的字節數的空間(_sumExample@8)

Windows編程常用的數據類型
看代碼會發現有很多以前學習C/C++沒有見過的大寫的數據類型
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
參考來源:https://www.bilibili.com/video/BV1Bb411e7av?p=3

使用兩個好玩的API
下載文件的功能
調用用URLDownloadToFile,要先鏈接 Urlmon.lib 這個庫
代碼如下

#include <Windows.h>
#include <tchar.h>
#pragma comment(lib, "Urlmon.lib")
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPTSTR lpCmdLine, INT nShowCmd)
{
	HRESULT hret = URLDownloadToFile(NULL, _T("https://s.cctry.com/images/eagle2.png"), _T("D:\\123.png"), 0, NULL);
	if (hret == S_OK)
	{
		MessageBox(NULL, _T("下載成功"), _T("下載圖片"), MB_OK);
	}
	return 0;
}

在這裏插入圖片描述
在這裏插入圖片描述
自動執行文件
#pragma comment(lib, “Urlmon.lib”)
用ShellExecuteEx(&SHELLEXECUTEINFO)
代碼

#include <Windows.h>
#include <tchar.h>
#pragma comment(lib, "Urlmon.lib")
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPTSTR lpCmdLine, INT nShowCmd)
{
	SHELLEXECUTEINFO ShellInfo = {0};
	ShellInfo.cbSize = sizeof(SHELLEXECUTEINFO);
	ShellInfo.lpVerb = _T("open");
	ShellInfo.lpFile = _T("D:\\123.png");
	ShellInfo.nShow = SW_SHOW;
	BOOL bret = ShellExecuteEx(&ShellInfo);
	return 0;
}

效果就是打開了lpFile指向的路徑的文件。

lpFile默認目錄是 C:\WINdonws ,如果要打開該目錄下的文件,可以用相對路徑
例如打開計算器

#include <Windows.h>
#include <tchar.h>
#pragma comment(lib, "Urlmon.lib")
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPTSTR lpCmdLine, INT nShowCmd)
{
	SHELLEXECUTEINFO ShellInfo = {0};
	ShellInfo.cbSize = sizeof(SHELLEXECUTEINFO);
	ShellInfo.lpVerb = _T("open");
	ShellInfo.lpFile = _T("calc.exe");
	ShellInfo.nShow = SW_SHOW;
	BOOL bret = ShellExecuteEx(&ShellInfo);
	return 0;
}

這樣子也是能成功打開的

能打開QQ、微信等軟件,圖片、視頻等文件,用默認瀏覽器打開網址等。
要打開網站記得要在前面加 www.

#include <Windows.h>
#include <tchar.h>
#pragma comment(lib, "Urlmon.lib")
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPTSTR lpCmdLine, INT nShowCmd)
{
	SHELLEXECUTEINFO ShellInfo = {0};
	ShellInfo.cbSize = sizeof(SHELLEXECUTEINFO);
	ShellInfo.lpVerb = _T("open");
	ShellInfo.lpFile = _T("www.baidu.com");
	ShellInfo.nShow = SW_SHOW;
	BOOL bret = ShellExecuteEx(&ShellInfo);
	return 0;
}

打開資源管理器

#include <Windows.h>
#include <tchar.h>
#pragma comment(lib, "Urlmon.lib")
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPTSTR lpCmdLine, INT nShowCmd)
{
	SHELLEXECUTEINFO ShellInfo = { 0 };
	ShellInfo.cbSize = sizeof(SHELLEXECUTEINFO);
	ShellInfo.lpVerb = _T("open");
	ShellInfo.lpFile = _T("explorer.exe");
	ShellInfo.nShow = SW_SHOW;
	BOOL bRet = ShellExecuteEx(&ShellInfo);
	return 0;
}

參考來源:https://www.bilibili.com/video/BV1Bb411e7av?p=4

文件的刪除、複製與重命名操作
刪除文件
DeleteFile() 參數是文件路徑

#include <Windows.h>
#include <tchar.h>
#pragma comment(lib, "Urlmon.lib")
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPTSTR lpCmdLine, INT nShowCmd)
{
	bool ret = DeleteFile(_T("D:\\123.png"));
	if (ret)
	{
		MessageBox(NULL, _T("刪除成功"), _T("刪除窗口"), MB_OK);
	}
	else
	{ 
		MessageBox(NULL, _T("刪除失敗"), _T("刪除窗口"), MB_OK);
	}
	return 0;
}

在這裏插入圖片描述
試了一下,刪除成功,回收站裏面沒有被刪除的文件,所以該操作是等價shift+delete的

同理複製文件、移動文件夾。查一下API函數,存入正確的參數即可。

獲取最後一次錯誤碼
多線程不會覆蓋各線程的錯誤碼

DWORD GetLastError(VOID);
可以百度查 WIN32 ERROR CODE ,看文檔裏對應的錯誤碼的錯誤信息,也可以在IDE裏,點 工具 -> 錯誤查找 輸入對應的錯誤碼來看錯誤信息。

文件的創建與打開
CreateFile()
通過參數決定是 打開存在的文件 還是 創建不存在的文件

文件的關閉
BOOL CloseHandle(HANDLE hObject);
傳入路徑,會關閉文件,包括文件、文件映射、進程、線程、安全和同步對象。
返回是否成功

獲取文件的大小
GetFileSzie();
第一個參數是文件句柄

獲取小於4GB的文件的大小,因爲用於表示的變量是32位的整型,如果要表示大於4G的,要再傳入一個高位的32爲整型參數,兩個值用位運算組合起來就好了。
結果是以字節爲單位的
在這裏插入圖片描述
GetFileSzieEx();
內部用的是一個聯合結構體,能夠用於獲取低於4GB和高於4GB的文件的大小,比上面的函數方便。
在這裏插入圖片描述
傳入文件句柄和LARGE_INTEGER指針

文件寫入
WriteFile
ReadFile
參數:文件句柄 文件大小 實際寫入/讀取的大小 (多數情況下爲NULL的一個參數)

文件指針及目錄的創建與刪除

SetFilePointer();
可以從頭開始讀、當前位置開始讀,從後往前讀。
注意從後往前讀的時候,文件指針要移動的距離的字節數的值應設爲負數。

CreateDirectory();
只能創建單一層級的目錄(文件夾)

如果要建立多層級的目錄,可以使用MakeSureDirectoryPathExists();函數

RemoveDirectory();
刪除一個現有的不包含任何文件的空目錄,如果要刪除非空目錄可以調用 SHFileOperation();

文件查找與遍歷
FindFirstFile(); 和 FindNextFile();
結束了記得調用FindClose(); 否則文件會一直處於打開狀態,無法刪除(除非程序關閉了)。

io.h下也有類似的函數: 博客鏈接

獲取磁盤分區信息
作用
安裝軟件時判斷所選路徑是否存在
寫日誌信息
遠控軟件

GetLogicalDriveStrings();
獲取一個字符串,包含當前所有邏輯驅動器的根驅動器目錄
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章