Проблемы с преобразованием типов данных - PullRequest
0 голосов
/ 28 июля 2010

несколько дней назад я опубликовал вопрос для реализации стека трассировки Win32 API с MSYS / Mingw: Прогулка стека Win32 API с 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 xpression stacktrace.cpp: 138: ошибка: недопустимое преобразование из USHORT (*)(ULONG, ULONG, voi d*, ULONG*)' to USHORT '

Я думаю, что эта проблема может быть связана с различиями типов между MSYS / MinGW и определениями dll.Явное определение USHORT #define USHORT unsigned short не имеет никакого эффекта.

Кто-нибудь знает, как я могу решить эту проблему?Буду глубоко признателен за любую подсказку.

С уважением, Кристиан

1 Ответ

2 голосов
/ 28 июля 2010

В последнем этапе вам нужно вызвать функцию, используя указатель функции func. Таким образом, это должно быть num = func( 1, 32, array, NULL ); В противном случае вы пытаетесь создать безымянный объект типа CaptureStackBackTraceType и пытаетесь преобразовать его в int. Поскольку преобразование не существует, компилятор выдает ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...