Перехват функций из dll, помогите разобрать 1 параметр

Тема в разделе "WASM.WIN32", создана пользователем redwall, 12 ноя 2010.

  1. redwall

    redwall New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2010
    Сообщения:
    6
    Есть dll, перехватываю оттуда функции.
    Но не знаю, как перехватить функции, у которых вот такой вид:
    Код (Text):
    1. void CConsoleElement::Set(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class K2Allocator<wchar_t> > const &)
    Как тогда описать свою функцию, на которую идет перенаправление? А точнее, как расшифровать это:
    Код (Text):
    1. class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class K2Allocator<wchar_t> > const &
    Если скопировать эту строку к себе в функцию, то не работает.

    Заранее спасибо.
     
  2. SoftCreator

    SoftCreator New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2010
    Сообщения:
    36
    А как именно не работает? Не компилируется, не выполняет действий, выполняет не то, крэш?
    Вообще это банальный const wstring&, но K2Allocator меня немного смущает, похоже, кастомный аллокатор.

    В принципе, если планируется просто использовать эту строку, не модифицируя ее (а она const, так что так и должно быть), попробуйте объявить свою функцию как void Handler(void* this, const wstring& str), ИМХО должно работать. На всякий случай, не забывайте, что первым параметром идет указатель this, а вторым - ссылка на строку.
     
  3. redwall

    redwall New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2010
    Сообщения:
    6
    Не компилируется.
    Попробовал - ругается.
    Код (Text):
    1. Error   1   error C2143: syntax error : missing ')' before 'this'
    2. Error   2   error C2143: syntax error : missing ';' before 'this'
    3. Error   3   error C2059: syntax error : ')'
    4. Error   4   error C2143: syntax error : missing ';' before '{' 
    5. Error   5   error C2447: '{' : missing function header (old-style formal list?)
     
  4. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    redwall,

    Функцию с void *this нужно обернуть в extern "C". Для С++ this — ключевое слово, таки чего-то значащее.
     
  5. SoftCreator

    SoftCreator New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2010
    Сообщения:
    36
    Ну это я образно насчет this. Правда, надо бы еще в ассемблере глянуть, какое соглашение о вызовах компилятор использует. Я видел и передачу this через стек, и через ecx. А зачем там extern "C"?
     
  6. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    SoftCreator,

    Я про то, что this — ключевое слово для C++. Нужно вынести Handler() в отдельный файл и скомпилировать как C, а в файле на C++ убрать this из прототипа и использовать extern "C" void Handler(void* /*this*/, const wstring& str);

    В другом варианте можно попробовать использовать struct dummy { void *Handler(const wstring& str); }; — по идее, должно получиться (адресом будет &dummy::Handler).

    __stdcall/__fastcall — по вкусу (надо смотреть, как перехватываемая функция ожидает).
     
  7. SoftCreator

    SoftCreator New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2010
    Сообщения:
    36
    Да, второй вариант, наверное, самый правильный будет