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 \r\n\nFunction: %s \r\n\nReason: %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;
}
win32多线程-新版本MtVerify.h的更多相关文章
- win32多线程-异步(asynchronous) I/O
I/O设备是个慢速设备,无论打印机.调制解调器,甚至硬盘,与CPU相比都奇慢无比,坐下来干等I/O的完成是一件不甚明智事情. 异步(asynchronous) I/O在win32多线程程序设计中被称为 ...
- win32多线程-异步过程调用(asynchronous Procedure Calls, APCs)
使用overlapped I/O并搭配event对象-----win32多线程-异步(asynchronous) I/O事例,会产生两个基础性问题. 第一个问题是,使用WaitForMultipleO ...
- 使用 MtVerify.h头文件 ,用的时候把他头文件的内容添加到项目
#include <windows.h> //windodws变量相关头文件 MtVerify.h的内容如下:#pragma comment( lib, "USER32&quo ...
- Win32多线程编程(3) — 线程同步与通信
一.线程间数据通信 系统从进程的地址空间中分配内存给线程栈使用.新线程与创建它的线程在相同的进程上下文中运行.因此,新线程可以访问进程内核对象的所有句柄.进程中的所有内存以及同一个进程中其他所有线 ...
- Win32 多线程的创建方法和基本使用
Win32多线程的创建方法主要有: (1)CreateThread() (2)_beginthread()&&_beginthreadex() (3)AfxBeginThread() ...
- 深入浅出Win32多线程程序设计之基本概念
一.深入浅出Win32多线程程序设计之基本概念[转] 引言 从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓 ...
- 多线程学习:win32多线程编程基本概念(转)
一.定义: 1.进程和线程的区别 进程:是程序的执行过程,具有动态性,即运行的程序就叫进程,不运行就叫程序 ,每个进程包含一到多个线程.线程:系统中的最小执行单元,同一进程中有多个线程,线程可以共享资 ...
- win32多线程: 线程创建与结束等待
#include<Windows.h> #include<iostream> using namespace std; /*1.在启动一个线程之前,必须为线程编写一个全局的线程 ...
- 由《win32多线程程序设计》临界区的问题所想
之前看侯捷翻译的<win32多线程程序设计>中关于线程同步中的临界区问题,其中举得例子是对链表的操作.死锁的问题是对一个Swaplist函数的问题,现列举代码如下: void SwapLi ...
随机推荐
- 高能天气——团队Scrum冲刺阶段-Day 4
高能天气--团队Scrum冲刺阶段-Day 4 今日完成任务 于欣月:基本实现课程表功能:每一个设置课程表的地方设置一个EditText和一个TextView,根据我们学校的课程情况设置了25个Edi ...
- 最长子回文字符串(Manacher’s Algorithm)
# # 大佬博客: https://www.cnblogs.com/z360/p/6375514.html https://blog.csdn.net/zuanfengxiao/article/det ...
- BZOJ2330 SCOI2011糖果
复习了一波差分约束. http://blog.csdn.net/my_sunshine26/article/details/72849441 构图方式记住就好. 本题要倒序插入否则会被卡. #incl ...
- HDU5919 SequenceⅡ
从后向前建主席树,以位置为下标建树,然后查询区间出现次数的第k/2大即可. 复杂度O(nlogn) #include<bits/stdc++.h> using namespace std; ...
- Python生成requirements.txt包依赖管理文件
requirements.txt是Python的依赖管理软件,和Java的POM一样. requirements.txt会生成使用了pip安装后的依赖包,在正常环境下会生成这个目录下的包/usr/lo ...
- 反接保护电路 Reverse Voltage Protection
Reverse Voltage Protection I've long wanted to pull together some reverse polarity protection ideas ...
- windows和linux 下将tomcat注册为服务
参考文献: tomcat注册成windows服务 背景 当前项目需要运行两个Tomcat,每次启动系统以后都要手动进入到tomcat目录执行startup.bat,非常烦,所以想将这两个tomcat直 ...
- 【Go命令教程】5. go clean
执行 go clean 命令会删除掉执行其它命令时产生的一些文件和目录,包括: 在使用 go build 命令时在当前代码包下生成的与包名同名或者与Go源码文件同名的可执行文件.在Windows下,则 ...
- MySQL是如何利用索引的
http://fordba.com/spend-10-min-to-understand-how-mysql-use-index.html
- C#远程调用技术WebService修炼手册
一.课程介绍 一位伟大的讲师曾经说过一句话:事物存在即合理!意思就是说:任何存在的事物都有其存在的原因,存在的一切事物都可以找到其存在的理由,我们应当把焦点放在因果关联的本质上.所以在本次分享课开课之 ...