分类: C/C++
2014-04-14 10:17:28
参考url:
http://blog.yeshj.com/onandoff/archive/2009/10/27/1479630.html
最近主要在修改bug, 发现单纯输入日志还是很难定位错误,就添加了一个堆栈输出的功能。用函数CaptureStackBackTraceType来实现的。发现在vs2008上编译通过,在vs2005上提示找不到该函数标示符。
查看msdn:
Requirements
Minimum supported client |
Windows XP [desktop apps only] |
Minimum supported server |
Windows Server 2003 [desktop apps only] |
Header |
WinBase.h (include Windows.h)
|
Library |
Kernel32.lib
|
DLL |
Kernel32.dll
|
很奇怪,为什么在vs2005下就找不到呢,
在vs2005工程下发现windows.h文件是来自以下目录:
D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\windows.h
Vs2008工程下的windows.h文件来自
C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\windows.h
打开文件,发现D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\windows.h
没有CaptureStackBackTraceType函数,
打开C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\windows.h, 发现有
#define CaptureStackBackTrace RtlCaptureStackBackTrace
到这里就明白为什么vs2005编译有错了。但是为什么会有2个不同的windows.h文件呢,这个头文件都是对kernel32.dll抛出的库文件啊,为什么会有2个不同的呢。
猜测如下:vs2005的时候,自带了Platformsdk,所以所有的系统库kernel32.lib等都在此包里。
Vs2008的时候,自带了winsdk6.4, winsdk中包括了platfromsdk。 所以一些新的函数如CaptureStackBackTraceType,在vs2005中就编译不过。
如何能够在vs2005中使用CaptureStackBackTraceType呢, 既然vs2008中能使用这个api,那说明kernel32.dll中是有该api抛出的。 而vs2005的库文件没有抛出而已。在vs2005中可以这样使用:
typedef USHORT (WINAPI *CaptureStackBackTraceType)(__in ULONG, __in ULONG, __out PVOID*, __out_opt PULONG);
CaptureStackBackTraceType func = (CaptureStackBackTraceType)(GetProcAddress(LoadLibrary("kernel32.dll"), "RtlCaptureStackBackTrace"));
查看vs2005的kernel32.lib文件,发现也存在该api, 所以自己申明一下函数也可以使用:
extern"C" USHORT __stdcall RtlCaptureStackBackTrace(
__in ULONG FramesToSkip,
__in ULONG FramesToCapture,
__out PVOID *BackTrace,
__out_opt PULONG BackTraceHash
);
我选择用动态导入的方式。
源码如下:
点击(此处)折叠或打开