Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Visual C++/MFC/WTL > как сделать CALLBACK-функцию членом класса? |
Автор: black_priest 13.12.2007, 16:36 | ||||
Есть такая функция
и есть метод класса
Как передать параметру dwCallback функции указатель на метод класса VJSoundIn ? ![]() |
Автор: BorisVorontsov 13.12.2007, 19:01 |
Сделай функцию статической |
Автор: black_priest 13.12.2007, 21:28 | ||||||
Спасибо, уже сделал, действительно помогает (во всяком случае скомпилировалось ![]() Сразу возник попутный вопрос. В определении класса (VJSoundIn.h):
В определнии метода класса (VJSoundIn.cpp)
При компиляции дает ошибку error C2724: 'VJSoundIn::DataBufferReady' : 'static' should not be used on member functions defined at file scope Если определить метод без слова static, т.е. так
то компилируется без ошибок. Поясните пожалуйста, почему? (строку перевел, смысл все равно не понятен) |
Автор: BorisVorontsov 14.12.2007, 10:11 |
Потому что обозвав функцию статической в файле реализации ты запретил её видимость для других модулей. Решение, как ты заметил, не обзывать её статической. |
Автор: black_priest 14.12.2007, 12:32 |
Смутило просто то, что в одном месте надо писать, а в другом уже не надо. Ведь по логике должно быть так, что ты посмотрел на функцию и можешь понять что она в общем из себя представляет, а так получается информацию о том, что функция статическая можно получить только из заголовочного файла. А CALLBACK, зараза, все равно не заработал. Есть серьезные подозрения, что причина в том, что приложение консольное. Может есть какие то тонкости при использовании CALLBACK механизмов в консольных приложениях? BorisVorontsov, спасибо за поддержку ![]() |
Автор: Coocky 14.12.2007, 13:58 |
Т.е. выразился неправильно ![]() __stdcall это convention-т.е согласование о вызове функции. 99% АПИ функций - __stdcall Т.е. параметры передаются справа на лево для стека и т.д и т.п. А то,что ты передаешь имя функции,так жто для того,что б вызвать в дебрях той функции,в которую ты передаешь твою калбек. Так что никакого механизма особого нет ![]() ![]() ![]() |
Автор: black_priest 14.12.2007, 14:43 | ||
Спасиб ребята, все заработало. Все таки моя ошибка была по невнимательности, когда waveInOpen делал, параметры попутал. Так что никаких проблем с __stdcall действительно нет. Единственно теперь то, что смущает это фраза из MSDN в описании wsweInProc:
Поэтому решил все-таки общаться с драйвером путем сообщений, т.е. вместо вызова CALLBACK функции, настроится на прием сообщений (что в принципе работало в моей программе с GUI, написанной ранее на дельфи). Но возникает сложность, как можно принимать сообщения, если приложение консольное, т.е. не имеет окна, и соотв. оконной процедуры. Погуглив немного этот вопрос, нашел, что часто рекомендуют создавать невидимые message only окна и работать с ними. Мне это решение как-то не очень понравилось. Может есть что-то другое? |
Автор: Coocky 15.12.2007, 22:53 |
black_priest, общаться через сообщения рекомендую только в СВОИХ окнах.Всякие невидимые окна,броадкасты и прочие "костыли" не привествую. Предлагаю обыкновенное межпроцессорное взаимодействие 1.Pipe хорошая штука.Но есть свои нюансы.Отложим 2.Обьекты синхронизации+ FileMapping /Хорошая вещь.Я через сервис общался со своим приложением ![]() Рекомендую ![]() |