powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / (Winapi) установить функцию обработки окна в другом потоке
7 сообщений из 7, страница 1 из 1
(Winapi) установить функцию обработки окна в другом потоке
    #33343764
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VB6

установить новую функцию обработки сообщений окна можно так:
PrevWndProc = apiSetWindowLong(hwnd, GWL_WNDPROC, AddrOf(NewFunction))

но это не работает если нужно задать функцию другого потока (исходная программа - MSaccess перехватывающая COM Addin dll)

принципиально возможно?
...
Рейтинг: 0 / 0
(Winapi) установить функцию обработки окна в другом потоке
    #33343815
АлексейКVB6

установить новую функцию обработки сообщений окна можно так:
PrevWndProc = apiSetWindowLong(hwnd, GWL_WNDPROC, AddrOf(NewFunction))

но это не работает если нужно задать функцию другого потока (исходная программа - MSaccess перехватывающая COM Addin dll)

принципиально возможно?
(правда, ниче я в етом ни панимаю,но сказать-то как хочется...)

ничче ни понял.
NewFunction штоли не в том же потоке исполняется (или будет исполняться), што и вызов SetWindowLong?
паскоку придполагаится, што они в одном процессе, то адресное пространство общее. Так что "принципиально-тиоритически" должно быть возможно.

тока во внимание надо принять, што, если тот поток будет VB6 потоком, то он должен быть полностью инициализированным и рабочим к моменту когда предполагается вызов NewFunction.
Простейший документированный способ - создать на том потоке объект и держать его "поднятым", что будет гарантировать работоспособность инфраструктуры потока. Кроме того, надо как-то позаботиться о маршаллизации полученного значения PrevWndProc "в тот поток" , штобы
NewFunction имела шанс ею как-то разумно воспользоваться. Надо же предусмотреть возможность возврата управления исходной функции.

ищи тырнет ваапще и вбакселератор в частности по имени Matthew Curland.
он вроде был главспецом по межпотокам в барсиках. книжки и статьи у него были в районе 99 года, где он разобъяснял пачиму за просто так работать ни будит и как изгаляться надо, если завместо васька своими руками типа Треад Локал Сторидж инициализировать придется.
щаз он вроде все (vb6) бросил и в каком-то ниверситете прохлаждаитси.

ну а если "тот поток" VBA - поток, то все тоже самои, вид сполубоку.
Мораль проста - поток к моменту вызова в нирабочим состоянии. вот и ни работаит.
...
Рейтинг: 0 / 0
(Winapi) установить функцию обработки окна в другом потоке
    #33343817
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
про поток я не просто так придумал - взял из:

firsteps
Функция SetWindowLong изменяет атрибуты определяемого окна. Функция также устанавливает 32-разрядное (длинное) значение при заданном смещении в дополнительном пространстве памяти об окне.

Синтаксис

LONG SetWindowLong
(
HWND hWnd, // дескриптор окна
int nIndex, // значение смещения, которое устанавливается
LONG dwNewLong //новое значение
);

Параметры

hWnd
Идентифицирует окно и, косвенно, класс, которому окно принадлежит.
nIndex
Определяет значение смещения, отсчитываемое от нуля, которое будет установлено. Допустимые значения находятся в диапазоне от нуля до числа байтов дополнительного пространства в памяти, минус 4; например, если бы Вы установили 12 или большее количество байтов памяти дополнительного пространства, значение 8 было бы индексом к третьему 32-разрядному целому числу. Чтобы установить любое другое значение, определите одно из следующих значений:

GWL_EXSTYLE - Устанавливает новый расширенный стиль окна.
GWL_STYLE - Устанавливает новый стиль окна.
GWL_WNDPROC - Устанавливает новый адрес для оконной процедуры.
GWL_HINSTANCE - Устанавливает новый дескриптор экземпляра прикладной программы.
GWL_ID - Устанавливает новый идентификатор окна.
GWL_USERDATA - Устанавливает 32-разрядное значение, связанное с окном. Каждое окно имеет соответствующее 32-разрядное значение, предназначенное для использования прикладной программой, которая создала окно.
Следующие значения также доступны, когда параметр hWnd идентифицирует диалоговое окно:

DWL_DLGPROC - Устанавливает новый адрес процедуры диалогового окна.
DWL_MSGRESULT - Устанавливает возвращаемое значение сообщения, обработанного в процедуре диалогового окна.
DWL_USER - Устанавливает новую дополнительную информацию, которая является частной для прикладной программы, типа дескрипторов или указателей.
dwNewLong
Устанавливает восстановленное значение.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение - предыдущее значение заданного 32-разрядного целого числа. Если функция не выполняет задачу, возвращаемое значение нулевое. Чтобы получать расширенные данные об ошибках, вызовите GetLastError. Если предыдущее значение заданного 32-разрядного целого числа нулевое, и функция завершается успешно, возвращаемое значение нулевое, но функция не очищает последние данные об ошибках. Это затрудняет определение успеха или сбоя. Чтобы бороться с этим, Вы должны очистить последние данные об ошибках, вызывая SetLastError (0) перед вызовом SetWindowLong. Тогда, функциональный сбой будет обозначен возвращаемым значением нуля и результата GetLastError, который является отличным от нуля.

Замечания
Функция SetWindowLong не выполняет задачу, если окно, заданное параметром hWnd не принадлежит тому же самому процессу, что и поток вызова. Если Вы используете функцию SetWindowLong и индекс GWL_WNDPROC, чтобы заменить оконную процедуру, оконная процедура должна соответствовать рекомендациям, заданным в описании функции повторного вызова WindowProc. Вызов SetWindowLong с индексом GWL_WNDPROC создает подкласс класса окна, которое используется, чтобы создать окно. Прикладная программа не должна быть подклассом окна, созданного другим процессом. Функция SetWindowLong создает подкласс окна, заменяя оконную процедуру, связанную с отдельным окном, вынуждая Windows вызвать новую оконную процедуру вместо предыдущей. Прикладная программа должна передавать любые сообщения, не обработанные новой оконной процедурой к предыдущей оконной процедуре, вызывая CallWindowProc. Это позволяет прикладной программе создавать цепочку оконных процедур. Резервное дополнительное пространство в памяти, устанавливает значение отличное от нуля в элементе cbWndExtra структуры WNDCLASS, используемой с функцией RegisterClass. Вы не должны вызвать SetWindowLong с индексом GWL_HWNDPARENT, чтобы заменить родителя дочернего окна. Взамен, используйте функцию SetParent.

Смотри также
CallWindowProc, GetWindowLong, GetWindowWord, RegisterClass, SetParent, SetWindowWord, WindowProc, WNDCLASS.
...
Рейтинг: 0 / 0
(Winapi) установить функцию обработки окна в другом потоке
    #33343842
выделенное место
авторФункция SetWindowLong не выполняет задачу, если окно, заданное параметром hWnd не принадлежит тому же самому процессу, что и поток вызова
говорит только, что функция обработки сообщений и обрабатываемое окно
должны принадлежать одному процессу. одному екзешнику то есть.
я так понимаю, что даже это можно обойти "в принципе".
Но при чем здесь исходный вопрос? создание окна в рамках одного потока и обработка его сообщений в другом потоке того же приложения никак выделенному красным не противоречит.
...
Рейтинг: 0 / 0
(Winapi) установить функцию обработки окна в другом потоке
    #33343845
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
изначально два приложения

яисходная программа - MSaccess перехватывающая COM Addin dll

ком аддин не референсный проект а отдельный ком объект (аддин)
...
Рейтинг: 0 / 0
(Winapi) установить функцию обработки окна в другом потоке
    #33343850
АлексейКизначально два приложения

яисходная программа - MSaccess перехватывающая COM Addin dll

ком аддин не референсный проект а отдельный ком объект (аддин)
Это фиолетово (кажется).
Вот что красным здесь - так это "синхронизация" жизни окна прод управлением пользователя в одном потоке и перехват его сообщений в другом.
Оно работать-то должно. Но специальные места есть - типа нажатия на крест в окне. (Или какой-нибудь End при работе отладчика, если перехватывается IDE). Окно -то рушится, а возврата к исходной функции обработки сообщений не обещано. При "неаккуратных обращениях" с такими местами должен быть крах с приветом. По крайней мере тиоритичиски.
Вероятно, это должно стать главной головной болью при "межпоточном перехвате".
...
Рейтинг: 0 / 0
(Winapi) установить функцию обработки окна в другом потоке
    #33344056
MsDatabaseru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... Но специальные места есть - типа нажатия на крест в окне. (Или какой-нибудь End при работе отладчика, если перехватывается IDE). Окно -то рушится, а возврата к исходной функции обработки сообщений не обещано. При "неаккуратных обращениях" с такими местами должен быть крах с приветом. По крайней мере тиоритичиски.
Вероятно, это должно стать главной головной болью при "межпоточном перехвате".


как раз с этим проблем нет т.к. есть отлаженный код который работает но в рамках одного процесса....
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / (Winapi) установить функцию обработки окна в другом потоке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]