Обратный звонок из другого потока - PullRequest
1 голос
/ 01 марта 2012

У меня проблема с обратными вызовами из другого потока приложения.Dll - это своего рода оболочка между приложением Addinational и прикладной программой, которая работает в памяти прикладных программ (с тем же PID).Дополнительное приложение (другой поток и PID) - это приложение, которое в основном цикле ищет «что-то», а когда находит его, оно вызывает функцию обратного вызова из Dll, а затем Dll вызывает функцию обратного вызова из прикладной программы.Может быть, это немного сбивает с толку взгляд на изображение выше.И происходит сбой (когда dll вызывает функцию обратного вызова из прикладной программы) с сообщением:

Необработанное исключение в 0x70786a46 в MainProgram.exe: 0xC0000005: Место чтения нарушения доступа 0x00000164.

Стек вызововmshtml.dll

Вероятно, прикладная программа, использующая элементы управления IE для обновления пользовательского интерфейса.Как я могу обновить пользовательский интерфейс при обратном вызове дополнительного приложения?

Callbacks

Ответы [ 2 ]

1 голос
/ 01 марта 2012

SendMessage - это общее решение для публикации результатов в ветке GUI.Он выполняет всю синхронизацию потока для вас и не возвращает, пока сообщение не будет обработано окном потока получателя.

PostThreadMessage менее надежно, поскольку сообщение может / будет потеряно, когда получатель находится вмодальный цикл, например, MessageBox, если только вы не добавили ловушку, которая перехватывает сообщение потока, поэтому просто используйте SendMessage.

. Более продвинутые методы включают в себя выполнение синхронизации потока самостоятельно, например, с буфером, но в любом случаеэто, вероятно, также потребует SendMessage для потока GUI, поэтому я предлагаю вам просто начать с этого, и, если это достаточно хорошо, не делать больше.

EDIT :черт, теперь я вижу, что хотя первое предложение говорит о потоках, на самом деле речь идет об отправке данных из одного процесса в другой процесс.Ну, для этого есть WM_COPYDATA.Обратите внимание, что указатель (на уровне пользователя) одного процесса недопустим в другом процессе .

0 голосов
/ 01 марта 2012

Итак, вы хотите вызвать функцию, которая принадлежит другому процессу. Я думаю, что вы должны прочитать о RPC: s http://msdn.microsoft.com/en-us/library/windows/desktop/aa378651%28v=vs.85%29.aspx

...