Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
В методе message вызываю сишную библиотеку в DLL и передаю ей указатель на метод my_event. Чтобы при наступлении определенного события, сишный код мог вызвать метод класса CCoEngine. В результате my_event вызывается, но при выходе из метода код крашится. Как тут все сделать правильно? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 11:08 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
Eolt, CCoEngine::my_event должен быть static ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 12:46 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
Siemargl, К сожалению нет :( CCoEngine::my_event вызывает другие методы класса CCoEngine, и поэтому он не может быть статическим. Как мне кажется, решение есть тут: http://rsdn.org/article/cpp/fastdelegate.xml#E4H Но знаний как применить это к моей ситуации не хватает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 12:54 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
Eolt, к сожалению, да dll на Си никак не может вызвать метод объекта ввиду отсутствия в Си концепции объекта ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 13:37 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
EoltCCoEngine::my_event вызывает другие методы класса CCoEngine, и поэтому он не может быть статическим. Поэтому его нельзя использовать как callback. Логика! Обычно функции, в которые передаются коллбэки имеют дополнительный параметр-указатель, в который и передают указатель на объект. А в самом коллбэке этот указатель используют чтобы вызвать метод объекта. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 13:40 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
Eolt(callback_function)(CCoEngine::my_event()) Кстати, этим принудительным приведением типа ты замаскировал грубый баг: использование результата вызова функции вместо адреса функции. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 13:43 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
Barlonedll на Си никак не может вызвать метод объекта ввиду отсутствия в Си концепции объекта Ничего страшного, COM объект в С может быть представлен соответствующей структурой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 13:52 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
BarloneEolt, к сожалению, да dll на Си никак не может вызвать метод объекта ввиду отсутствия в Си концепции объекта Но тем не менее, метод вызывается. В отладчике я попадаю в CCoEngine::my_event когда его вызывает сишная DLL. Понятно, что видимо параметры в стеке не правильно расположены, или соглашение вызова не то. Как я думаю проблема в этом. И возможно каким-то "грязным хаком" ее удастся решить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 13:59 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
Eolt, вам уже написали, если у функции регистрации коллбека есть дополнительный параметр - указатель, который потом в колбек передается - туда нужно сложить указатель на объект. Если нет - ну разве что через глобальную переменную... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 14:03 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
EoltНо тем не менее, метод вызывается. В отладчике я попадаю в CCoEngine::my_event когда его вызывает сишная DLL. Нет. См. выше. Ты в него попадаешь когда он вызывается перед вызовом функции из DLL. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 14:05 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovEolt(callback_function)(CCoEngine::my_event()) Кстати, этим принудительным приведением типа ты замаскировал грубый баг: использование результата вызова функции вместо адреса функции. С чего бы это? Результат возвращается в EAX а не на стеке. Вкратце - механика такая. У тебя, ТС, указатель на член-функцию. У которой тип вызова _stdcall и есть неявный параметр (передается через стек) this. А вызывающая функция, очевидно, хочет что то другое (надо смотреть определение callback_function). В итоге после вызова происходит разбалансировка стека (адрес возврата не там где ожидался). Грубым приведением к (callback_function) ты обошел контроль компилятора. Это я пишу из предположения что это x86-32, при x86-64 параметр был вы в регистре RCX, и пока бы не вылетало =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 17:37 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
SiemarglDimitry Sibiryakovпропущено... Кстати, этим принудительным приведением типа ты замаскировал грубый баг: использование результата вызова функции вместо адреса функции. С чего бы это? Результат возвращается в EAX а не на стеке. А точно - скобочки прозевал. Но это уже еще одна ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 17:38 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
SiemarglУ тебя, ТС, указатель на член-функцию. Ткни пальцем: в каком месте у него "указатель на член-функцию"? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 17:42 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
SiemarglSiemarglпропущено... С чего бы это? Результат возвращается в EAX а не на стеке. А точно - скобочки прозевал. Но это уже еще одна ошибка. Dimitry SibiryakovSiemarglУ тебя, ТС, указатель на член-функцию. Ткни пальцем: в каком месте у него "указатель на член-функцию"? Если посмотреть еще раз внимательнее, то у него там и вызова то нет - там синтаксическая ошибка - нельзя вызвать нестатическую ф-цию без экземпляра. Так что мое первое предложение в силе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 18:05 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
Siemarglтам синтаксическая ошибка - нельзя вызвать нестатическую ф-цию без экземпляра. Можно, если вызов стоит в методе соответствующего класса или его потомка. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 18:19 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovSiemarglтам синтаксическая ошибка - нельзя вызвать нестатическую ф-цию без экземпляра. Можно, если вызов стоит в методе соответствующего класса или его потомка. И правда можно. Это компилятор насоветовал скобочки при попытке компиляции push_callback_function(hwnd, callback_function(CCoEngine::my_event), 2); error: invalid use of member function (did you forget the '()' ?) Вот он виноват. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 19:58 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovEoltНо тем не менее, метод вызывается. В отладчике я попадаю в CCoEngine::my_event когда его вызывает сишная DLL. Нет. См. выше. Ты в него попадаешь когда он вызывается перед вызовом функции из DLL. да попасть то в метод в отладчике можно, вопрос, что далее будет, когда уже пропал... this левый, либо обращение к неведомой памяти, либо затирка таблицы виртуальных функций, а конец один - GPF. защита памяти, снятие задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 20:57 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
MasterZivthis левый С чего вдруг? Ты вообще пять сообщений выше прочитал или как обычно сгоряча фигню порешь? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 21:09 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovMasterZivthis левый С чего вдруг? Ты вообще пять сообщений выше прочитал или как обычно сгоряча фигню порешь? ну, я невнимательно читал, да. ладно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 13:17 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Переделал код с учетом ошибок. dll_event - теперь статический метод и туда приходит событие из DLL. Теперь мне надо вызвать Event_Alert, чтобы в COM объекте возникло событие и передалось клиенту, который получил бы содержимое переменной msg. Как это сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 16:15 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
Eolt, прототип и описание push_callback_function покажите ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 08:36 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
Barlone, Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 09:13 |
|
||
|
Крашится при выходе из метода класса, вызванного по-указателю внешней библиотекой
|
|||
|---|---|---|---|
|
#18+
Решил сам Нужна глобальная переменная: Код: plaintext 1. статическая переменная в классе CCoEngine Код: plaintext 1. 2. в CCoEngine::message() присвоить ей ссылку на объект Код: plaintext 1. А в статическом dll_event вызвать метод объекта по указателю" Код: plaintext 1. В COM-клиенте событие происходит! УРа! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 13:31 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=32&tid=2018369]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
| others: | 273ms |
| total: | 429ms |

| 0 / 0 |
