Посылка сообщений в чужой процесс

Обсуждение проектов наших жителей.
Вы можете выставить проект на тест или найти помощников для его реализации.

Модератор: BV

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Посылка сообщений в чужой процесс

Сообщение tyomitch » 11.02.2005 (Пт) 20:19

Хотел написать Кирпич, но чего-то он получился очень сырой. Выложу пока тут :-)

Суть: мессаги больше WM_USER - а именно такие используют, например, все Common Controls - по умолчанию не маршалятся, т.е. передаваемый в них указатель должен указывать на данные в АП получателя. Значит, надо как-то внедрять туда свой участок памяти и передавать указатель на него.

Эта техника не нова, она использовалась Оловянниковым в его примере "Who lives in my system tray" (правда, он у меня так и не заработал ни на одной Винде) и мной в теме "Расширить часики в трее". Здесь я хотел построить реюзабельный компонент для этого дела, чтобы не изобретать велосипед каждый раз.

Структура компонента: 2 файла - modMarshal.bas и cMarshal.cls
CreateMarshal создаёт по hWnd маршалер (объект cMarshal) заданного размера (по умолчанию - 1024 байта).
cMarshal::MarshalInto передаёт данные в процесс получателя
cMarshal::MarshalFrom получает данные из процесса получателя

Объект cMarshal при своём уничтожении сам закроет все хэндлы, об этом заботиться не надо.

Совместимость: проверено на Win2000, скорее всего будет работать в WinNT4+
Если кому-то не лень приделать поддержку Win9x, милости прошу :-)

[приложение удалено]
Последний раз редактировалось tyomitch 12.02.2005 (Сб) 14:36, всего редактировалось 1 раз.
Изображение

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 11.02.2005 (Пт) 20:24

Visual Basic 6.0 писал(а):VarPtrByVal - Sub Or Function Not Defined
:(
Моду создают модоки, а распространяют модозвоны.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.02.2005 (Пт) 21:30

Да, работает зашибись :)
Только для кирпичей их следует отсоединять от других кирпичей :)
hCORe, замени на VarPtr и пойдет.


Только пример отказался у меня понимать функцию Left$(), это локальный глюк или последствия вмешательства?
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.02.2005 (Пт) 21:30

Если бы ты еще к нему добавил надежный алгоритм нахождения координат значка в трее, тебе бы цены не было :)
Lasciate ogni speranza, voi ch'entrate.

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 11.02.2005 (Пт) 21:50

alibek писал(а):hCORe, замени на VarPtr и пойдет

DILLAF? (расшифруй сам :)) На VarPtr я заменял. При этом программа загружается, но работает неправильно. Пишет, что в трее 0 значков, а в "Быстром запуске" - пять и все с надписью "Запустить оборзеватель Internet Explorer" :shock:
Моду создают модоки, а распространяют модозвоны.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.02.2005 (Пт) 22:04

А система какая? У меня все правильно показывал.
И под каким аккаунтом ты логинишься, админским или обычным?
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.02.2005 (Пт) 22:30

Прежде всего, всем спасибо за тестирование :-)

VapPtrByVal у меня объявлена отдельно следующим образом:
Код: Выделить всё
Public Declare Function VarPtrByVal Lib "msvbvm60" Alias "VarPtr" (Data As Any) As Long
, как-то забыл приложить её к проекту :oops:

Про Left не понял. Что значит - "отказался понимать"?

Ещё всех прошу указывать систему, где проверяете.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.02.2005 (Пт) 22:45

Да, кирпич действительно сырой... На WinXP не работал совсем :-(

Вот обновлённая версия:
Код: Выделить всё
Option Explicit
Private Type TBBUTTON
   iBitmap As Long
   idCommand As Long
   fsState As Byte
   fsStyle As Byte
   bReserved1 As Byte
   bReserved2 As Byte
   dwData As Long
   iString As Long
End Type
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetDlgItem Lib "user32" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hwndParent As Long, ByVal hwndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long
Private Const TB_GETBUTTONTEXT = &H400& + 75&
Private Const TB_BUTTONCOUNT = &H400& + 24&
Private Const TB_GETBUTTON = &H400& + 23&
Private Const TBSTATE_HIDDEN = &H8

Private Sub Form_Load()
Dim hWnd As Long, n As Long, hWndPager As Long
    hWnd = GetDlgItem(FindWindow("Shell_TrayWnd", vbNullString), &H12F)
    hWndPager = FindWindowEx(hWnd, 0, "SysPager", vbNullString): If hWndPager = 0 Then hWndPager = hWnd
    hWnd = FindWindowEx(hWndPager, 0, "ToolbarWindow32", vbNullString)
    n = SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0)
    Print "Â òðåå îáíàðóæåíî " & n & " èêîíîê."
    DumpToolbar hWnd, n

    hWnd = FindWindowEx(FindWindowEx(FindWindow("Shell_TrayWnd", vbNullString), 0, "ReBarWindow32", vbNullString), 0, "ToolbarWindow32", vbNullString)
    n = SendMessage(hWnd, TB_BUTTONCOUNT, 0, 0)
    Print "Â ïàíåëè áûñòðîãî çàïóñêà îáíàðóæåíî " & n & " èêîíîê."
    DumpToolbar hWnd, n
End Sub

Private Sub DumpToolbar(ByVal hWnd As Long, ByVal n As Long)
Dim i As Long, Caption As String
Dim m As cMarshal: Set m = CreateMarshal(hWnd)
Dim tb As TBBUTTON
    For i = 0 To n - 1
    With m
        .MarshalInto VarPtr(tb), Len(tb)
        SendMessage hWnd, TB_GETBUTTON, i, .rpMarshal
        .MarshalFrom VarPtr(tb), Len(tb)
        If tb.iString <> -1 Then
            Caption = Space(256)
            .MarshalInto StrPtr(Caption), 256
            n = SendMessage(hWnd, TB_GETBUTTONTEXT, tb.idCommand, .rpMarshal)
            .MarshalFrom StrPtr(Caption), 256
            Print Left(Caption, n)
        End If
    End With
    Next
    Print
End Sub


Ссылок на VarPtrByVal больше нет.
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.02.2005 (Пт) 22:49

"Отказывается понять" означает что VB не знает такую функцию. Видимо забыл из-за шоковой терапии, которая пишет в процессы.

P.S. А зачем тебе VarPtrByVal? Ведь VarPtr понимает и UDT?
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.02.2005 (Пт) 22:51

P.P.S. Сорри, обманул я. Left$() глючит из-за того, что n=-1.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.02.2005 (Пт) 22:53

3P.S. У меня второй вариант работает замечательно. Думаю, своровать у тебя кое-что :)
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.02.2005 (Пт) 23:31

VarPtrByVal у меня оставался от других частей проекта. Эти два модуля вырваны из большого-большого проекта. Там он был нужен :-)

Раз теперь всё работает, может мне перекинуть прогу в Кирпичи?
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.02.2005 (Сб) 0:24

alibek писал(а):Если бы ты еще к нему добавил надежный алгоритм нахождения координат значка в трее, тебе бы цены не было :)

Оценивай :-)
У вас нет доступа для просмотра вложений в этом сообщении.
Изображение

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 12.02.2005 (Сб) 0:43

Пришел Я :) Увидел незнакомую тему, открыл, прокрутил вниз :) Смотрю - пример от Тёмыча, 0 скачек! Непорядок :( Скачал, посмотрел... Да это же то, что мне сейчас нужно!!! :D Пасиба!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.02.2005 (Сб) 5:45

Блин, как невовремя сетка порвалась :)

Ща, заценим и будем критиковать :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 12.02.2005 (Сб) 10:49

tyomitch писал(а):Оценивай :-)

Рулез! :)
Респект!
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.02.2005 (Вс) 2:45

Совместимость с Win9x приделал, но там отдельная проблема: в Win98 трей - не тулбар :-(

Сейчас перепишу демо-пример на Быстрый Запуск, и выложу в Кирпичах.
Изображение


Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

    TopList