Название: как узнать какая dll использовала callback ? Отправлено: admsasha от Июнь 02, 2011, 15:22 Есть программа с что-то типа плагинами, я через функцию библиотеки передаю callback функцию основной формы (как бы для обратной связи)
Как узнать, какая именно библиотека вызвала этот callback ? Естественно не передавая эту метку явно через функцию. Название: Re: как узнать какая dll использовала callback ? Отправлено: Igors от Июнь 02, 2011, 16:33 "какая dll" не совсем так, приложение может иметь несколько экземпляров одного плагина использующих одну и ту же dll но с разными данными. Можно просто запомнить указатель на плагин (объект) перед вызовом dll ф-ции. Для multi-thread плюс еще ID нитки
Название: Re: как узнать какая dll использовала callback ? Отправлено: admsasha от Июнь 02, 2011, 16:56 "какая dll" не совсем так, приложение может иметь несколько экземпляров одного плагина использующих одну и ту же dll но с разными данными. Да, действительно. Как-то не подумалМожно просто запомнить указатель на плагин (объект) перед вызовом dll ф-ции. А вот тут подробнее, пожалуйстаВот я, например вызывал из библиотеки функцию SetCallback и назначил ей callback setText. Т.е. теперь сама библиотека может менять текст в основной программе. Код: QLibrary library; какой указатель запомнить ? Название: Re: как узнать какая dll использовала callback ? Отправлено: Igors от Июнь 02, 2011, 18:02 какой указатель запомнить ? Простой/примитивный вариантКод
Название: Re: как узнать какая dll использовала callback ? Отправлено: Авварон от Июнь 02, 2011, 18:12 Если можно поменять тело ф-ии в либе, то может проще сделать как нормальные люди - в ее сигнатуру добавить void *data ?
Название: Re: как узнать какая dll использовала callback ? Отправлено: Igors от Июнь 02, 2011, 19:06 Если можно поменять тело ф-ии в либе, то может проще сделать как нормальные люди - в ее сигнатуру добавить void *data ? На мой взгляд это не проще и не лучше- перекомпилировать либу не всегда просто, да и ф-ция может быть не одна - неск объектов зовут ту же dll - dll вызываетcя через др dll, напр цепочка host->dll1->...->dll2->callback А из хоста нужен по существу scoped_lock Название: Re: как узнать какая dll использовала callback ? Отправлено: BRE от Июнь 02, 2011, 20:14 Простой/примитивный вариант Не вариант.Зачем сохранять указатель в переменной theActiveLib при установке callback-функции, а после этого ее обнулять? :) Ведь вызываться установленная функция (setText) будет не в этот момент, а потом. Название: Re: как узнать какая dll использовала callback ? Отправлено: Igors от Июнь 02, 2011, 20:51 Ведь вызываться установленная функция (setText) будет не в этот момент, а потом. Ага, живой (а я уж думал Вы заболели :))Если "потом" то окружить те dll ф-ции из которых setText зовется, это несложно сделать в общем виде. Суть та же Название: Re: как узнать какая dll использовала callback ? Отправлено: BRE от Июнь 02, 2011, 21:10 Ага, живой (а я уж думал Вы заболели :)) Ну так, твоими молитвами... :)Если "потом" то окружить те dll ф-ции из которых setText зовется, это несложно сделать в общем виде. Суть та же Т.е. изменить все функции во всех библиотеках, которые будут использовать этот callback? Что-то мне подсказывает, что топикстартер хотел все это сделать меньшими усилиями. ;)Если есть возможность изменить все библиотеки, то проще изменить интерфейс и штатно передавать какой-то идентификатор библиотеки. Название: Re: как узнать какая dll использовала callback ? Отправлено: Igors от Июнь 02, 2011, 22:04 Т.е. изменить все функции во всех библиотеках, которые будут использовать этот callback? Та нет, либы не трогать, просто поменять обертки. Напр есть dll ф-цияКод Вместо нее использовать Код
Название: Re: как узнать какая dll использовала callback ? Отправлено: BRE от Июнь 02, 2011, 22:13 Та нет, либы не трогать, просто поменять обертки. Напр есть dll ф-ция На самом деле в библиотеке есть функция, которая регистрирует callback-функцию. Далее эта функция будет вызвана и уже в ней нужно определить кто ее дернул.Код
Название: Re: как узнать какая dll использовала callback ? Отправлено: admsasha от Июнь 03, 2011, 02:10 Простой/примитивный вариант Это подходит, если бы вызывающая библиотека была одна. А как сделать, если их, например, 10 ? В моем примере, они все считываются из какой то условной папки. А потом ждем вызов функции setText(). Ну а в ней нужно сделать, например, лог. "Такая то dll вызвала эту функцию".Если есть возможность изменить все библиотеки, то проще изменить интерфейс и штатно передавать какой-то идентификатор библиотеки. Выше я писал, что без передачи какого либо специального параметра. Название: Re: как узнать какая dll использовала callback ? Отправлено: Igors от Июнь 03, 2011, 10:00 На самом деле в библиотеке есть функция, которая регистрирует callback-функцию. Далее эта функция будет вызвана и уже в ней нужно определить кто ее дернул. Можно дать каждой dll свою callback, но это случай частный, так можно отследить только dll (модуль), да и регистрации никто не обещалЭто подходит, если бы вызывающая библиотека была одна. А как сделать, если их, например, 10 ? В моем примере, они все считываются из какой то условной папки. А потом ждем вызов функции setText(). Без разницы 1, 10 или 100. Приложение (хост) всегда знает когда оно отдает управление в dll (плагин) и всегда знает в какой именно. Нужно только перед отдачей управления (вызовом dll ф-ции) сохранить эту информацию. Что сохранять - дело хозяйское. Напр если интересно только имя файла Код
Название: Re: как узнать какая dll использовала callback ? Отправлено: BRE от Июнь 03, 2011, 11:44 Небольшой набросок:
Код
Название: Re: как узнать какая dll использовала callback ? Отправлено: admsasha от Июнь 03, 2011, 12:22 Это-то понятно.
Но ведь библиотека может слать сигнал в основную программу и не по вызову, а по своему какому либо таймеру. Или не может ? :) Название: Re: как узнать какая dll использовала callback ? Отправлено: Igors от Июнь 03, 2011, 13:23 Это-то понятно. В ситуациях когда dll открывает свои окна, крутит цикл событий, таймер и.т.п. все проще т.к. хосту известно какой плагин какое окно создал.Но ведь библиотека может слать сигнал в основную программу и не по вызову, а по своему какому либо таймеру. Или не может ? :) Название: Re: как узнать какая dll использовала callback ? Отправлено: BRE от Июнь 03, 2011, 13:29 Это-то понятно. Конечно может. Можно добавить таймер и посмотреть. :)Но ведь библиотека может слать сигнал в основную программу и не по вызову, а по своему какому либо таймеру. Или не может ? :) |