Есть dll, перехватываю оттуда функции. Но не знаю, как перехватить функции, у которых вот такой вид: Код (Text): void CConsoleElement::Set(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class K2Allocator<wchar_t> > const &) Как тогда описать свою функцию, на которую идет перенаправление? А точнее, как расшифровать это: Код (Text): class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class K2Allocator<wchar_t> > const & Если скопировать эту строку к себе в функцию, то не работает. Заранее спасибо.
А как именно не работает? Не компилируется, не выполняет действий, выполняет не то, крэш? Вообще это банальный const wstring&, но K2Allocator меня немного смущает, похоже, кастомный аллокатор. В принципе, если планируется просто использовать эту строку, не модифицируя ее (а она const, так что так и должно быть), попробуйте объявить свою функцию как void Handler(void* this, const wstring& str), ИМХО должно работать. На всякий случай, не забывайте, что первым параметром идет указатель this, а вторым - ссылка на строку.
Не компилируется. Попробовал - ругается. Код (Text): Error 1 error C2143: syntax error : missing ')' before 'this' Error 2 error C2143: syntax error : missing ';' before 'this' Error 3 error C2059: syntax error : ')' Error 4 error C2143: syntax error : missing ';' before '{' Error 5 error C2447: '{' : missing function header (old-style formal list?)
redwall, Функцию с void *this нужно обернуть в extern "C". Для С++ this — ключевое слово, таки чего-то значащее.
Ну это я образно насчет this. Правда, надо бы еще в ассемблере глянуть, какое соглашение о вызовах компилятор использует. Я видел и передачу this через стек, и через ecx. А зачем там extern "C"?
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 — по вкусу (надо смотреть, как перехватываемая функция ожидает).