c++ - 数据类型转换问题

标签 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*)' 到 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/

相关文章:

c - 使用 MinGW GCC 在 Windows CMD 上更改代码页时,将 _POSIX_C_SOURCE 定义为 2 会导致错误

c++ - C++ 构造函数中体系结构 x86_64 的 GCC undefined symbol

c++ - C++求三个字符串中所有字符出现的次数

c++ - 使用 win32 构建 C++ 代码的任何提示?

gdb - mingw gdb 64 位构建

c - MinGW错误 "undefined reference to '类型''"

c++ - 单个列表中的多个类类型

c++ - 如何设置.vcxproj以让MSBuild编译dll

winapi - 隐式与显式链接到 DLL

c++ - 如何安全地解除阻塞的 Win32 API?