HP-Socket學習01 Windows

  • #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架構

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