数据类型转换问题

时间:2010-07-28 06:45:29

标签: c++ winapi mingw

前几天我发布了一个关于使用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*)' to USHORT'

转换无效

我认为这个问题可能是由于MSYS / MinGW和dll定义之间的类型差异造成的。明确定义USHORT #define USHORT unsigned short无效。

有谁知道如何解决这个问题? 我会非常感激任何提示。

祝你好运, 基督教

1 个答案:

答案 0 :(得分:2)

在最后一个版本中,您需要使用函数指针func来调用该函数。所以它应该是num = func( 1, 32, array, NULL );否则,您正在尝试创建CaptureStackBackTraceType类型的未命名对象,并尝试将其转换为int。由于转换不存在,编译器发出错误。