Страницы: 1
RSS
Получить сообщение WM_COPYDATA
 
Добрый день .   Подскажите ,пожалуйста, как можно наладить обмен сообщениями между двумя приложениями VBA (в excel) , которые открыты в разных окнах(разные процессы) . Необходимость иметь 2 приложения обусловлена однопоточностью excel . Пробую через sendmessage , отправляю , а получить не понимаю как, примеры для vb весят excel .
       так посылаю  сообщение:
Код
1
2
3
4
5
6
7
8
9
10
11
12
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
Код
1
2
3
4
5
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. Последний Ваш код отформатировал тегом <...>. Остальные отформатируйте сами. Спасибо.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
объявляю для посыла вот так
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
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 бит объявлять надо иначе. попробуйте так:
Код
1
2
3
4
5
6
7
8
9
10
11
12
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 надо пробовать так:
Код
1
2
3
4
5
6
7
8
9
10
11
12
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
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Код
1
2
3
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битных версий  ;)
Код
1
2
3
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
Читают тему
Loading...