Страницы: 1
RSS
Получить сообщение WM_COPYDATA
 
Добрый день .   Подскажите ,пожалуйста, как можно наладить обмен сообщениями между двумя приложениями VBA (в excel) , которые открыты в разных окнах(разные процессы) . Необходимость иметь 2 приложения обусловлена однопоточностью excel . Пробую через sendmessage , отправляю , а получить не понимаю как, примеры для vb весят excel .
       так посылаю  сообщение:
Код
Dim hwnd As Long
Dim cds As COPYDATASTRUCT
Dim sMsg As String
    
hwnd = FindWindow("XLMAIN", "Microsoft Excel - TR3.xlsm")

          sMsg = "письмо"

          cds.dwData = 0
          cds.cbData = Len(sMsg) * 2 + 2
          cds.lpData = StrPtr(sMsg)
          i = SendMessage(hwnd, WM_COPYDATA, 0&, cds)
и пробую принять
смотрю пример для vb от microsoft https://support.microsoft.com/en-us/kb/176058

и вот эта процедура приводит к мерцанию caption редактора vba и зависанию excel
Код
Public Sub Hook() 
 lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, _
          AddressOf WindowProc)
          Debug.Print lpPrevWndProc
      End Sub



Что тут можно сделать? Может есть какие-то более очевидные способы сообщения?
Изменено: Алексей Александрович - 01.12.2015 21:40:33
 
Что Вы ожидаете видеть в результате? Как по Вашему работает функция SendMessage?
Где у Вас задано значение для WM_COPYDATA? Каково оно?
Где описание структуры COPYDATASTRUCT? Есть ли оно?

P.S. Последний Ваш код отформатировал тегом <...>. Остальные отформатируйте сами. Спасибо.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
объявляю для посыла вот так
Код
Option Explicit

Type COPYDATASTRUCT
    dwData As Long
    cbData As Long
    lpData As Long
End Type

Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Long, ByVal wMsg As Long, _
    ByVal wParam As Long, lParam As Any) As Long

Const WM_COPYDATA = &H4A


Ну а в результате хочу обмена текстовыми сообщениями добиться , отправка сообщения работает четко , проверял на приложении написанном в delphi (принимать сообщение из excel) , но вот прием в vba непонятен
 
Битность системы какая? Не 64 бита, случаем?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Excel 2007  ,  Win 7  64
 
Так для 64 бит объявлять надо иначе. попробуйте так:
Код
Option Explicit
Type COPYDATASTRUCT
    dwData As Variant
    cbData As Variant
    lpData As Variant
End Type
 
Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As LongPtr, ByVal wMsg As Long, _
    ByVal wParam As LongPtr, lParam As Any) As LongPtr
 
Const WM_COPYDATA = &H4A

А, нет. Так не выйдет - у Вас 2007 офис. Был бы 2010 - сработал бы PtrSafe. А в 2007 надо пробовать так:
Код
Option Explicit
Type COPYDATASTRUCT
    dwData As Variant
    cbData As Variant
    lpData As Variant
End Type
 
Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As LongLong, ByVal wMsg As Long, _
    ByVal wParam As LongLong, lParam As Any) As LongLong
 
Const WM_COPYDATA = &H4A
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Код
Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As LongLong, ByVal wMsg As Long, _
    ByVal wParam As LongLong, lParam As Any) As LongLong


не компилируется , выдает  Ambiguous name detected : SendMessage
Изменено: Алексей Александрович - 01.12.2015 22:26:06
 
Ну так Вы по сообщению не можете понять, что надо удалить одну из объявленных функций? Нельзя объявить две одинаковых функции с одним именем в одной области видимости.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Виноват) , но все равно не компилирует эту строку,  User defined type  not defined
 
И что при этом выделяет VBA? Опять угадывать? :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
VBA выделяет всю эту строку и выдает ошибку User defined type not defined
 
.....ByVal wMsg As LongLong...
Согласие есть продукт при полном непротивлении сторон
 
У Вас точно 2007 Excel?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Доброе время суток
Цитата
The_Prist написал:
А в 2007 надо пробовать так:
В 2007 нет типа LongLong - он доступен начиная с 2010 и то только для 64битных версий  ;)
Код
Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Long, ByVal wMsg As Long, _
    ByVal wParam As Long, lParam As Any) As Long
 
Цитата
Андрей VG написал:
В 2007 нет типа LongLong
Как бы...Обратите внимание на первые сообщения - именно такой код функции, который Вы привели, у ТС изначально присутствует и он не работает. Хотя должен бы. Поэтому испытываем разные вариации  ;)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Читают тему
Наверх