几天前,我发布了一个关于使用 MSYS/Mingw 实现 win32 API 堆栈跟踪的问题:Win32 API stack walk with MinGW/MSYS?
显式加载 dll 的提示是正确的解决方案。因此,我重新开始尝试使用 win32 CaptureStackBackTrace API 机制来实现有关此提示的堆栈跟踪。 dll 的加载工作正常:
// Load the RTLCapture context function:
HINSTANCE kernel32 = LoadLibrary("Kernel32.dll");
if(kernel32 != NULL){
std::cout << "Try to load method from kernel32.dll: CaptureStackBackTrace" << std::endl;
typedef USHORT (*CaptureStackBackTraceType)(ULONG FramesToSkip, ULONG FramesToCapture, void* BackTrace, ULONG* BackTraceHash);
CaptureStackBackTraceType func = (CaptureStackBackTraceType) GetProcAddress( kernel32, "RtlCaptureStackBackTrace" );
if(func==NULL){
std::cout << "Handle for CaptureStackBackTrace could't loded! Stop demo!."<< std::endl;
FreeLibrary(kernel32);
kernel32 = NULL;
func = NULL;
exit(1);
}
void *array[63];
int i,num = 0;
std::cout << "Try to call CaptureStackBackTrace..."<< std::endl;
num = CaptureStackBackTraceType( 1, 32, array, NULL );}
但是如果我调用 CaptureStackBackTraceType 方法并在类型转换问题中运行,我会遇到麻烦:
stacktrace.cpp:138: 错误:功能转换表达式列表被视为复合 e
表情
stacktrace.cpp:138: 错误:从 USHORT (*)(ULONG, ULONG, voi
d*, ULONG*)' 到
USHORT'
我认为这个问题可能是由于 MSYS/MinGW 和 dll 定义之间的类型差异造成的。显式定义 USHORT #define USHORT unsigned short 无效。
有人知道我该如何解决这个问题吗? 如果有任何提示,我将不胜感激。
最好的问候, 基督徒
最佳答案
在最后一段中,您需要使用函数指针func
来调用该函数。所以它应该是 num = func( 1, 32, array, NULL );
否则,您正在尝试创建类型为 CaptureStackBackTraceType
的未命名对象并尝试将其转换为一个 int
。由于转换不存在,编译器发出错误。
关于c++ - 数据类型转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3350480/