- #pragma warning(push)
#pragma warning只對當前文件有效(對於.h,對包含它的cpp也是有效的),而不是對整個工程的所有文件有效。當該文件編譯結束,設置也就失去作用。
#pragma warning(disable: n)
將某個警報置爲失效
#pragma warning(default: n)
將報警置爲默認
#pragma warning (default : 4996)
太多警告看着厭煩無視之
#pragma warning(push)
存儲當前報警設置。
#pragma warning(push, n)
存儲當前報警設置,並設置報警級別爲n。n爲從1到4的自然數。
#pragma warning(pop)
恢復之前壓入堆棧的報警設置。在一對push和pop之間作的任何報警相關設置都將失效。
#pragma warning(default: n)
將報警置爲默認
某些警告如C4309是從上到下生效的。即文件內#pragma warning從上到下遍歷,依次生效。
例如:
void func()
{
#pragma warning(disable: 4189)
char s;
s = 128;
#pragma warning(default: 4189)
char c;
c = 128;
}
則s = 128不會產生C4309報警,而C4309會產生報警。
某些警告例如C4189是以函數中最後出現的#pragma warning設置爲準的,其餘針對該報警的設置都是無效的。
例如:
void func()
{
#pragma warning(disable: 4189)
int x = 1;
#pragma warning(default: 4189)
}
則C4189仍然會出現,因爲default指令是函數的最後一條。在該文件內的其他函數中,如果沒有重新設置,C4189也是以#pragma warning(default: 4189)爲準。如果重新設置,同樣是按照其函數中的最後一個#pragma warning爲準。
某些警告(MSDN認爲是大於等於C4700的警告)是在函數結束後才能生效。
例如:
#pragma warning(disable:4700)
void Func()
{
int x;
int y = x;
#pragma warning(default:4700)
int z= x;
}
則y = x和z = x都不會產生C4700報警。只有在函數結束後的後的另外一個函數中,#pragma warning(default:4700)才能生效。
https://blog.csdn.net/bosbear/article/details/7290380
https://blog.csdn.net/suchang1127/article/details/49486445
- CreateFileMapping
HANDLE WINAPI CreateFileMapping(
_In_HANDLE hFile, //物理文件句柄
_In_opt_LPSECURITY_ATTRIBUTES lpAttributes, //安全設置
_In_DWORD flProtect, //保護設置
_In_DWORD dwMaximumSizeHigh, //高位文件大小
_In_DWORD dwMaximumSizeLow, //低位文件大小
_In_opt_LPCTSTR lpName); //共享內存名稱
_In_HANDLE hFile, //物理文件句柄
任何可以獲得的物理文件句柄, 如果你需要創建一個物理文件無關的內存映射也無妨, 將它設置成爲 0xFFFFFFFF(INVALID_HANDLE_VALUE)就可以了.
如果需要和物理文件關聯, 要確保你的物理文件創建的時候的訪問模式和"保護設置"匹配, 比如: 物理文件只讀, 內存映射需要讀寫就會發生錯誤. 推薦你的物理文件使用獨佔方式創建.
如果使用 INVALID_HANDLE_VALUE, 也需要設置需要申請的內存空間的大小, 無論物理文件句柄參數是否有效, 這樣 CreateFileMapping 就可以創建一個和物理文件大小無關的內存空間給你, 甚至超過實際文件大小, 如果你的物理文件有效, 而大小參數爲0, 則返回給你的是一個和物理文件大小一樣的內存空間地址範圍. 返回給你的文件映射地址空間是可以通過複製, 集成或者命名得到, 初始內容爲0.
_In_opt_LPSECURITY_ATTRIBUTES lpAttributes, //安全設置
它指明返回的句柄是否可以被子進程所繼承,指定一個安全對象,在創建文件映射時使用。如果爲NULL(用ByVal As Long傳遞零),表示使用默認安全對象。
_In_DWORD flProtect, //保護設置
下述常數之一:
PAGE_READONLY 以只讀方式打開映射
PAGE_READWRITE 以可讀、可寫方式打開映射
PAGE_WRITECOPY 爲寫操作留下備份
PAGE_EXECUTE_READ 允許視圖被映射到只讀的複製寫入或執行訪問。指定的文件句柄hFile必須創建與參數GENERIC_READ和通用_EXECUTE訪問權限。
WindowsServer2003和WindowsXP:這個值不可用,直到WindowsXPSP2和WindowsServer2003SP1。
PAGE_EXECUTE_ReadWrite允許視圖中被映射爲只讀,copy-on-write,讀取/寫入或執行訪問。該文件句柄,hFile參數指定要創建的GENERIC_READ,GENERIC_WRITE,和通用_EXECUTE訪問權限。
WindowsServer2003和WindowsXP:這個值不可用,直到WindowsXPSP2和WindowsServer2003SP1。
PAGE_EXECUTE_writecopy 允許視圖被映射到只讀的複製寫入或執行訪問。這個值相當於PAGE_EXECUTE_READ。該文件句柄,hFile參數指定要創建的GENERIC_READ和通用_EXECUTE訪問權限。
WindowsVista:這個值不可用,直到WindowsVistaSP1。
WindowsServer2003和WindowsXP:這個值不被支持。
可組合使用下述一個或多個常數:
SEC_COMMIT 爲文件映射一個小節中的所有頁分配內存
SEC_IMAGE 文件是個可執行文件
SEC_RESERVE 爲沒有分配實際內存的一個小節保留虛擬內存空間
還有其他參數:https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-createfilemappinga
_In_DWORD dwMaximumSizeHigh, //高位文件大小
文件映射的最大長度的高32位。一般爲NULL。
_In_DWORD dwMaximumSizeLow, //低位文件大小
文件映射的最大長度的低32位。如這個參數和dwMaximumSizeHigh都是零,就用磁盤文件的實際長度。
_In_opt_LPCTSTR lpName); //共享內存名稱
指定文件映射對象的名字。如存在這個名字的一個映射,函數就會打開它。用vbNullString可以創建一個無名的文件映射。
調用CreateFileMapping的時候GetLastError的對應錯誤
ERROR_FILE_INVALID 如果企圖創建一個零長度的文件映射, 應有此報
ERROR_INVALID_HANDLE 如果發現你的命名內存空間和現有的內存映射, 互斥量, 信號量, 臨界區同名就麻煩了
ERROR_ALREADY_EXISTS 表示內存空間命名已經存在
相關服務或者平臺的命名保留
Terminal Services:
命名可以包含 "Global\" 或者 "Local\" 前綴在全局或者會話名空間初級文件映射. 其他部分可以包含任何除了(\)以外的字符, 可以參考 Kernel Object Name Spaces.
Windows 2000 or later:
如果 Terminal Services 沒有運行 "Global\" 和 "Local\" 前綴的特殊含義就被忽略了
- timeGetTime
函數以 毫秒 計的系統時間。該時間爲從系統開啓算起所經過的時間。
在SDK中,可以用 DWORD timeGetTime(VOID)函數獲取系統時間,其返回值是毫秒單位的。可以用其實現延時功能的函數。
注:在使用timeGetTime()函數之前應先包含頭文件#include <Mmsystem.h>或#include <Windows.h>並在project->settings->link->Object/library modules中添加winmm.lib
也可以在文件頭部添加 #pragma comment( lib,"winmm.lib" )
命令行:#pragma comment( lib,"xxx.lib" )時預編譯處理指令,讓vc將winmm.lib添加到工程中去進行編譯。
備註:該函數與timeGetSystemTime()函數的唯一不同是timeGetSystemTime()函數使用MMTIME結構返回系統時間。TimeGetSystemTime()比timeGetTime()需要更多的系統開銷。注意timeGetTime()函數是一個雙字。這個值在0到2^32之間。大約49.71天。如果在代碼中直接將該值用於計算,會導致一些問題,特別是用該值來控制代碼的執行。一般利用兩個timeGetTime()函數返回值的不同來用於計算。
Windows NT:該函數的時間精度是五毫秒或更大一些,這取決於機器的性能。可用timeBeginPeriod和timeEndPeriod函數提高timeGetTime函數的精度。如果使用了,連續調用timeGetTime函數,一系列返回值的差異由timeBeginPeriod和timeEndPeriod決定。QueryPerformanceCounter QueryPerformanceFrequency函數用於分辨率要求更高的時間測量。
Windows95 默認分辨率是1毫秒,無論是否調用timeBeginPeriod和timeEndPeriod函數。
https://docs.microsoft.com/en-us/windows/desktop/api/timeapi/nf-timeapi-timegettime
- GetNativeSystemInfo
將當前系統的信息檢索到運行在WOW64下的應用程序。如果該函數是在64位應用程序中調用的,或者是在沒有Intel64或x64處理器(比如ARM64)的64位系統中調用的,那麼它就相當於GetSystemInfo函數。
要確定基於win32的應用程序是否在WOW64下運行,請調用IsWow64Process2函數。
要編譯使用此函數的應用程序,請將_WIN32_WINNT定義爲0x0501或更高版本。有關更多信息,請參閱使用Windows標頭。
與GetSystemInfo相比:
GetSystemInfo運行win32程序在x64位系統下,會獲得x86的CPU架構