Добрый день . Подскажите ,пожалуйста, как можно наладить обмен сообщениями между двумя приложениями 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)
Что Вы ожидаете видеть в результате? Как по Вашему работает функция 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 бит объявлять надо иначе. попробуйте так:
Код
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
Ну так Вы по сообщению не можете понять, что надо удалить одну из объявленных функций? Нельзя объявить две одинаковых функции с одним именем в одной области видимости.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
В 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
Как бы...Обратите внимание на первые сообщения - именно такой код функции, который Вы привели, у ТС изначально присутствует и он не работает. Хотя должен бы. Поэтому испытываем разные вариации
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...