一个多线程的宏 mtverify.h

antss 2008-08-18 10:41:58
请问这个文件mtverify.h这个文件在哪?我搜索了include的文件夹还是没有.
自己按书上定义了一个,又问题百出,在这里把代码写出来,请大侠指导.
小虾,想请问一个问题,这个文件都是自己定义的吗?搜了什么也没搜到.相关信息提到这个是c runtime library
我用的环境是VC 6.0




#pragma comment(lib,"USER32")
#include <crtdbg.h>


#define MTASSERT(a) _ASSERTE(a)
#define MTVERIFY(a) if(!(a))
PrintError(#a,_FILE_,_LINE_,GetLastError())
void PrintError(LPSTR linedesc,LPSTR filename,int lineno,DWORD errnum);

static void PrintError(LPSTR linedesc,LPSTR filename,int lineno,DWORD errnum)
{
LPSTR lpBuffer;
char errbuf[256];
#ifdef _WINDOWS
char modulename[MAX_PATH];
#else
DWORD numread;
#endif


FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
errnum,
LANG_NEUTRAL,
(LPTSTR)&lpBuffer,
0,
NULL);
wsprintf(errbuf,"\nThe following call failed at line %d in %s:\n\n",\
%s\n\nReason:%s\n",lineno,filename,linedesc,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_TASKMODAT|MB_SETFOREGROUND);
#endif
exit(EXIT_FAILURE);


}


...全文
386 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuexivcxiao 2009-10-15
  • 打赏
  • 举报
回复
真的很有用啊
abcwangdragon 2008-08-23
  • 打赏
  • 举报
回复
我也正在看这本书,C++多线程的书真是不多呀
antss 2008-08-19
  • 打赏
  • 举报
回复
有没有大侠,进来帮忙解决一下问题呐.
jay的Fans 2008-08-19
  • 打赏
  • 举报
回复
不好意思,没怎么研究过这个
antss 2008-08-19
  • 打赏
  • 举报
回复
太感激你了.我都等了一天了,我看的是电子书,按书上写的.调试的时候,总是有这样那样的问题.能力尚不够.四处求助.终得到帮助,我太高兴了.

我想请问一下,这个宏C库,C++库不提供吗?
jay的Fans 2008-08-19
  • 打赏
  • 举报
回复
没记错的话,这是侯捷那本《win32多线程设计》那本书里的,好像是作者自己写的
下面是那个文件内容
/*
* MtVerify.h
*
* Error handling for applications in
* "Multitheading Applications in Win32"
*
* 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. For the examples in this book, this works fine.
* 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.
*/

#pragma comment( lib, "USER32" )

#include <crtdbg.h>
#define MTASSERT(a) _ASSERTE(a)


#define MTVERIFY(a) if (!(a)) PrintError(#a,__FILE__,__LINE__,GetLastError())

__inline void PrintError(LPSTR linedesc, LPSTR filename, int lineno, DWORD errnum)
{
LPSTR lpBuffer;
char errbuf[256];
#ifdef _WINDOWS
char modulename[MAX_PATH];
#else // _WINDOWS
DWORD numread;
#endif // _WINDOWS

FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
errnum,
LANG_NEUTRAL,
(LPTSTR)&lpBuffer,
0,
NULL );

wsprintf(errbuf, "\nThe following call failed at line %d in %s:\n\n"
" %s\n\nReason: %s\n", lineno, filename, linedesc, 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);
}
antss 2008-08-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 seayou 的回复:]
你USER32 库加进来了吗
可以在c盘下搜搜 USER32 这个库
[/Quote]

我加了,
用这个方法

#pragma comment(lib,"user32");
seayou 2008-08-18
  • 打赏
  • 举报
回复
你USER32 库加进来了吗
可以在c盘下搜搜 USER32 这个库

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧