Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
(Winapi) установить функцию обработки окна в другом потоке
|
|||
|---|---|---|---|
|
#18+
VB6 установить новую функцию обработки сообщений окна можно так: PrevWndProc = apiSetWindowLong(hwnd, GWL_WNDPROC, AddrOf(NewFunction)) но это не работает если нужно задать функцию другого потока (исходная программа - MSaccess перехватывающая COM Addin dll) принципиально возможно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2005, 22:18 |
|
||
|
(Winapi) установить функцию обработки окна в другом потоке
|
|||
|---|---|---|---|
|
#18+
АлексейКVB6 установить новую функцию обработки сообщений окна можно так: PrevWndProc = apiSetWindowLong(hwnd, GWL_WNDPROC, AddrOf(NewFunction)) но это не работает если нужно задать функцию другого потока (исходная программа - MSaccess перехватывающая COM Addin dll) принципиально возможно? (правда, ниче я в етом ни панимаю,но сказать-то как хочется...) ничче ни понял. NewFunction штоли не в том же потоке исполняется (или будет исполняться), што и вызов SetWindowLong? паскоку придполагаится, што они в одном процессе, то адресное пространство общее. Так что "принципиально-тиоритически" должно быть возможно. тока во внимание надо принять, што, если тот поток будет VB6 потоком, то он должен быть полностью инициализированным и рабочим к моменту когда предполагается вызов NewFunction. Простейший документированный способ - создать на том потоке объект и держать его "поднятым", что будет гарантировать работоспособность инфраструктуры потока. Кроме того, надо как-то позаботиться о маршаллизации полученного значения PrevWndProc "в тот поток" , штобы NewFunction имела шанс ею как-то разумно воспользоваться. Надо же предусмотреть возможность возврата управления исходной функции. ищи тырнет ваапще и вбакселератор в частности по имени Matthew Curland. он вроде был главспецом по межпотокам в барсиках. книжки и статьи у него были в районе 99 года, где он разобъяснял пачиму за просто так работать ни будит и как изгаляться надо, если завместо васька своими руками типа Треад Локал Сторидж инициализировать придется. щаз он вроде все (vb6) бросил и в каком-то ниверситете прохлаждаитси. ну а если "тот поток" VBA - поток, то все тоже самои, вид сполубоку. Мораль проста - поток к моменту вызова в нирабочим состоянии. вот и ни работаит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2005, 23:22 |
|
||
|
(Winapi) установить функцию обработки окна в другом потоке
|
|||
|---|---|---|---|
|
#18+
про поток я не просто так придумал - взял из: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2005, 23:27 |
|
||
|
(Winapi) установить функцию обработки окна в другом потоке
|
|||
|---|---|---|---|
|
#18+
выделенное место авторФункция SetWindowLong не выполняет задачу, если окно, заданное параметром hWnd не принадлежит тому же самому процессу, что и поток вызова говорит только, что функция обработки сообщений и обрабатываемое окно должны принадлежать одному процессу. одному екзешнику то есть. я так понимаю, что даже это можно обойти "в принципе". Но при чем здесь исходный вопрос? создание окна в рамках одного потока и обработка его сообщений в другом потоке того же приложения никак выделенному красным не противоречит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2005, 00:10 |
|
||
|
(Winapi) установить функцию обработки окна в другом потоке
|
|||
|---|---|---|---|
|
#18+
изначально два приложения яисходная программа - MSaccess перехватывающая COM Addin dll ком аддин не референсный проект а отдельный ком объект (аддин) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2005, 00:21 |
|
||
|
(Winapi) установить функцию обработки окна в другом потоке
|
|||
|---|---|---|---|
|
#18+
АлексейКизначально два приложения яисходная программа - MSaccess перехватывающая COM Addin dll ком аддин не референсный проект а отдельный ком объект (аддин) Это фиолетово (кажется). Вот что красным здесь - так это "синхронизация" жизни окна прод управлением пользователя в одном потоке и перехват его сообщений в другом. Оно работать-то должно. Но специальные места есть - типа нажатия на крест в окне. (Или какой-нибудь End при работе отладчика, если перехватывается IDE). Окно -то рушится, а возврата к исходной функции обработки сообщений не обещано. При "неаккуратных обращениях" с такими местами должен быть крах с приветом. По крайней мере тиоритичиски. Вероятно, это должно стать главной головной болью при "межпоточном перехвате". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2005, 00:28 |
|
||
|
(Winapi) установить функцию обработки окна в другом потоке
|
|||
|---|---|---|---|
|
#18+
... Но специальные места есть - типа нажатия на крест в окне. (Или какой-нибудь End при работе отладчика, если перехватывается IDE). Окно -то рушится, а возврата к исходной функции обработки сообщений не обещано. При "неаккуратных обращениях" с такими местами должен быть крах с приветом. По крайней мере тиоритичиски. Вероятно, это должно стать главной головной болью при "межпоточном перехвате". как раз с этим проблем нет т.к. есть отлаженный код который работает но в рамках одного процесса.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2005, 09:12 |
|
||
|
|

start [/forum/topic.php?fid=16&gotonew=1&tid=1347319]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
61ms |
get topic data: |
13ms |
get first new msg: |
7ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 260ms |
| total: | 442ms |

| 0 / 0 |
