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架构

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