• win32多线程-新版本MtVerify.h


    api调用错误诊断宏,对GetLastError()函数的封装,并解析错误

    从网上找的版本并进行了部分修改

      /*  
      * MtVerify.h  
      *  
      * The function PrintError() is marked as __inline so that it can be  
      * included from one or more C or C++ files without multiple definition  
      * errors.   
      * To use the PrintError() in an application, it should be taken out,  
      * placed in its own source file, and the "__inline" declaration removed  
      * so the function will be globally available.  
      * [Modified by thinkhy 10/01/04] ...  
      * [Modified by thinkhy 10/01/07] Added function Myverify.  
      */  
      
    #pragma comment( lib,   "USER32"   )  
    #define MTASSERT(a) _ASSERTE(a)  
    
    #ifdef _DEBUG  
    #define MTVERIFY(a) MyVerify(a,_T(#a))  
    #else  
    #define MTVERIFY(f)          ((  void  )(f))  
    #endif  
    
    __inline  void   PrintError(LPTSTR filename,  int   lineno, LPTSTR lpszFunc, DWORD errnum)
    {
    	LPTSTR lpBuffer;
    	TCHAR errbuf[ 256  ];
    #ifdef _WINDOWS  
    	TCHAR modulename[MAX_PATH];
    #else    // _WINDOWS  
    	DWORD numread;
    #endif    // _WINDOWS  
    
    	FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER
    		| FORMAT_MESSAGE_FROM_SYSTEM,
    		NULL  ,
    		errnum,
    		LANG_NEUTRAL,
    		(LPTSTR)&lpBuffer,  // 这个参数很变态! [Commented by thinkhy 10/01/04]  
    		0  ,
    		NULL   );
    
    	wsprintf(errbuf, _T("Failed at Line: %d in File: %s 
    
    Function: %s 
    
    Reason: %s"),
    		lineno, filename, lpszFunc, lpBuffer);
    #ifndef _WINDOWS  
    	WriteFile(GetStdHandle(STD_ERROR_HANDLE), errbuf, strlen(errbuf), &numread, FALSE );
    	Sleep( 3000  );
    #else  
    	GetModuleFileName( NULL  , modulename, MAX_PATH);
    	MessageBox( NULL  , errbuf, modulename, MB_ICONWARNING|MB_OK|MB_TASKMODAL|MB_SETFOREGROUND);
    #endif  
    	// exit(EXIT_FAILURE);  
    	return  ;
    }
    
    __inline BOOL MyVerify(BOOL what,LPTSTR lpszFunc)
    {
    #ifdef _DEBUG  
    	if   (!what)
    		PrintError(_T( __FILE__  ),  __LINE__  , lpszFunc,GetLastError());
    #endif  
    	return   what;
    } 
    


     

    WriteFile(GetStdHandle(STD_ERROR_HANDLE), errbuf, strlen(errbuf), &numread, FALSE ); //错误输出到console窗口

    GetStdHandle它用于从一个特定的标准设备(标准输入、标准输出或标准错误)中取得一个句柄。

    事例如下:

    #include <windows.h>
    //GetStdHandle和SetConsoleTextAttribute在头文件windows.h中
    #include <iostream>
    using namespace std;
    void SetColor(unsigned short ForeColor=3,unsigned short BackGroundColor=0)
    //给参数默认值,使它
    //可以接受0/1/2个参数
    {
    	HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); //本例以输出为例
    	SetConsoleTextAttribute(hCon,ForeColor|BackGroundColor);
    }
    int main()
    {
    	SetColor();
    	std::cout<<"Hello world!"<<endl;
    	SetColor(40,30);
    	std::cout<<"Hello world!"<<endl;
    	std::cout<<"Hello world!"<<endl;
    
    	getchar();
    	return 0;
    }
  • 相关阅读:
    欧拉函数
    uva10870 矩阵
    poj3233 矩阵等比数列求和 二分
    hdu4990 矩阵
    hdu4549 矩阵快速幂 + 欧拉降幂
    补矩阵的题目
    CodeForces 450B 矩阵
    hoj2662 状态压缩dp
    poj3254 状态压缩dp
    zoj2770 差分约束系统
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3212116.html
Copyright © 2020-2023  润新知