Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Сопряжение программ Добавлено: 17.06.10 15:21  

Автор вопроса:  Dark Engine | Web-сайт: www.wentas.2bb.ru | ICQ: 343191665 
Как обеспечить обмен данными между двумя (и более) программами на VB (работаю на 6).
Вопрос не слишком умный, но мне нужен именно
оптимизированный вариант.
Знаю, можно:
-через файл (медленно и не очень удобно)
-через буфер обмена (может перебиться инфа, если параллельно работать, скажем, в Word или редактировать программу)
Есть ли возможность посылать из одной программы в другую данные, желательно так, чтобы эти данные пришли именно в нужную программу? Через какие функции это реализуется?

Ответить

  Ответы Всего ответов: 27  

Номер ответа: 1
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #1
Добавлено: 17.06.10 17:16
Мьютексы, мэйлслоты, сообщения, атомы, семафоры, ивенты... дальше перечислять? Вариантов масса, кури МСДН.

Ответить

Номер ответа: 2
Автор ответа:
 Dark Engine



ICQ: 343191665 

Вопросов: 51
Ответов: 98
 Web-сайт: www.wentas.2bb.ru
 Профиль | | #2
Добавлено: 17.06.10 17:44
Вот где бы мне его еще взять... смешно до ужаса, но "шестерка" у меня без MSDN :( потому и приходится порой заходить сюда с глупыми вопросами.
Есть вариант где-то еще это все выцепить, проанализировать и выбрать оптимальный? Причем, желательно с примерами... ну или хотя бы с именами API-функций, через которые работает?

Ответить

Номер ответа: 3
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #3 Добавлено: 17.06.10 17:50
Вот тебе MSDN
http://msdn.microsoft.com/ru-ru/default.aspx

Ответить

Номер ответа: 4
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #4
Добавлено: 17.06.10 17:57
=))) Чел по ходу не знает, что такое Интернет, а на форум через телеграф ходит.

Ответить

Номер ответа: 5
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #5
Добавлено: 17.06.10 20:36
Помню, к CrosswordCreator я написал скриптовый язык в виде отдельной программы. Маленький. Он отсылал команды CrosswordCreator через реестр, и ждал ответа. А тот в другом ключе реестра отвечал. О как))

Ответить

Номер ответа: 6
Автор ответа:
 Dark Engine



ICQ: 343191665 

Вопросов: 51
Ответов: 98
 Web-сайт: www.wentas.2bb.ru
 Профиль | | #6
Добавлено: 17.06.10 21:28
VβÐUηìt пишет:
Он отсылал команды CrosswordCreator через реестр,

Интересная мысль. Но по сути - тоже самое, что и мои два варианта. Ну может быть только не так заметно юзеру. Я просто допускаю, что информацию придется передавать в таких объемах, которые ни один тип ключа реестра не воспримет. А по порциям будет ну очень медленно.

Executioner пишет:
Чел по ходу не знает, что такое Интернет, а на форум через телеграф ходит.

С инетом просто море проблем. Дома инет через USB-модем, на работе траффик контроллируют. Скачать MSDN возможным не представляется.

Ответить

Номер ответа: 7
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #7
Добавлено: 17.06.10 21:48
Если нижеследующая реализация плоха и можно сделать что-то проще лучше удобней, то расскажите)
  1. Private Sub Form_Load()
  2.     If Not findServer Then End
  3.     Call hook
  4. End Sub
  5. Private Sub Form_Unload(Cancel As Integer)
  6.     Call unhook
  7.     Call destroyDummy
  8. End Sub
  1. '    Copyright 2009, 2010 Makarov Andrey
  2. '
  3. '    This file is part of hooktool (Audica service program).
  4. '
  5. '    Audica is free software: you can redistribute it and/or modify
  6. '    it under the terms of the GNU General Public License as published by
  7. '    the Free Software Foundation, either version 3 of the License, or
  8. '    (at your option) any later version.
  9. '
  10. '    Audica is distributed in the hope that it will be useful,
  11. '    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. '    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. '    GNU General Public License for more details.
  14. '
  15. '    You should have received a copy of the GNU General Public License
  16. '    along with Audica.  If not, see <http://www.gnu.org/licenses/>.
  17.  
  18. Option Explicit
  19. Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  20. 'Private Const WM_COPYDATA As Long = &H4A
  21. Private Const WM_USER As Long = &H400
  22. Private Const WM_WHEEL As Long = (WM_USER + 1)
  23. Private Const WM_KEYS As Long = (WM_USER + 2)
  24. Private Const WM_REGHOOK As Long = (WM_USER + 3)
  25. Private Const WM_UNREGHOOK As Long = WM_REGHOOK
  26.  
  27. Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  28. Private Const WINDOW_NAME As String = "Audica_Dummy"
  29. Private Const HOOK_NAME As String = "HookTool_Dummy"
  30. Private Declare Function DefWindowProc Lib "user32.dll" Alias "DefWindowProcA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  31. Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  32. Private Const GWL_WNDPROC As Long = -4
  33. Private Declare Function CreateWindowEx Lib "user32.dll" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hmenu As Long, ByVal hInstance As Long, ByRef lpParam As Any) As Long
  34. Private Declare Function DestroyWindow Lib "user32.dll" (ByVal hWnd As Long) As Long
  35. Private wnd As Long, dummy As Long
  36.  
  37. Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
  38. Public Declare Function SetWindowsHookEx Lib "USER32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
  39. Public Declare Function UnhookWindowsHookEx Lib "USER32" (ByVal hHook As Long) As Long
  40. Private Declare Function CallNextHookEx Lib "USER32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
  41. Private Const HC_ACTION = 0
  42. Private Const WM_KEYDOWN = &H100
  43. Private Const WM_KEYUP = &H101
  44. Private Const WM_SYSKEYDOWN = &H104
  45. Private Const WM_SYSKEYUP = &H105
  46. Private Const WH_KEYBOARD_LL = 13
  47. Private Const WM_MOUSEWHEEL = &H20A
  48. Private Const WH_MOUSE_LL As Long = 14
  49. Private Type KBDLLHOOKSTRUCT
  50.     vkCode As Long
  51.     scanCode As Long
  52.     Flags As Long
  53.     time As Long
  54.     dwExtraInfo As Long
  55. End Type
  56. Private p As KBDLLHOOKSTRUCT
  57. Private mou_rotat As Integer
  58. Private kbd_hook_hndl As Long
  59. Private mou_hook_hndl As Long
  60. Public kbd_keys As New Collection 'Коллекция нажатых клавиш
  61.  
  62. Public Sub hook()
  63.     kbd_hook_hndl = _
  64.         SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf km_hook_proc, App.hInstance, 0)
  65.     mou_hook_hndl = _
  66.         SetWindowsHookEx(WH_MOUSE_LL, AddressOf km_hook_proc, App.hInstance, 0)
  67. End Sub
  68.  
  69. Public Sub unhook()
  70.     If kbd_hook_hndl <> 0 Then _
  71.         UnhookWindowsHookEx kbd_hook_hndl
  72.     kbd_hook_hndl = 0
  73.     If mou_hook_hndl <> 0 Then _
  74.         UnhookWindowsHookEx mou_hook_hndl
  75.     mou_hook_hndl = 0
  76. End Sub
  77.  
  78. Public Function km_hook_proc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  79.     If nCode = HC_ACTION Then
  80.         Select Case wParam
  81.         Case WM_MOUSEWHEEL
  82.             CopyMemory mou_rotat, ByVal lParam + 10, 2
  83.             PostMessage wnd, WM_WHEEL, App.hInstance, CLng(Sgn(mou_rotat))
  84.         Case WM_KEYDOWN, WM_SYSKEYDOWN
  85.             CopyMemory p, ByVal lParam, Len(p)
  86.             If valByKey(p.vkCode) = -1 Then
  87.                 kbd_keys.Add p.vkCode, CStr(p.vkCode)
  88.                 PostMessage wnd, WM_KEYS, kbd_keys.Count, p.vkCode
  89.             End If
  90.         Case WM_KEYUP, WM_SYSKEYUP
  91.             CopyMemory p, ByVal lParam, Len(p)
  92.             If valByKey(p.vkCode) <> -1 Then _
  93.                 kbd_keys.Remove CStr(p.vkCode)
  94.             PostMessage wnd, WM_KEYS, kbd_keys.Count, -p.vkCode
  95.         End Select
  96.     End If
  97.     km_hook_proc = CallNextHookEx(0, nCode, wParam, ByVal lParam)
  98. End Function
  99.  
  100. Private Function valByKey(ByVal key As String) As Long
  101. On Error GoTo 1:
  102.     valByKey = kbd_keys.Item(key)
  103. Exit Function
  104. 1:  valByKey = -1
  105. End Function
  106.  
  107. Private Function int_WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  108.     If uMsg = WM_UNREGHOOK Then Unload Form1
  109.     int_WindowProc = DefWindowProc(hWnd, uMsg, wParam, lParam)
  110. End Function
  111.  
  112. 'Найти сервер, создать дамми-окно, зарегистрировать его на сервере
  113. Public Function findServer() As Boolean
  114.     Dim prev As Long
  115.     If b(prev, FindWindow(vbNullString, HOOK_NAME)) Then _
  116.         PostMessage prev, WM_UNREGHOOK, 0, 0    'Выключить запущенный hooktool
  117.     If b(wnd, FindWindow(vbNullString, WINDOW_NAME)) Then
  118.         If dummy = 0 Then
  119.             dummy = CreateWindowEx(0, "STATIC", HOOK_NAME, 0, 0, 0, 0, 0, 0, 0, 0, ByVal 0)
  120.             SetWindowLong dummy, GWL_WNDPROC, AddressOf int_WindowProc
  121.         End If
  122.         PostMessage wnd, WM_REGHOOK, App.hInstance, dummy
  123.         findServer = True
  124.     End If
  125. End Function
  126.  
  127. Public Sub destroyDummy()
  128.     If dummy Then _
  129.         DestroyWindow dummy
  130. End Sub
  131.  
  132. Private Function b(p1 As Long, p2 As Long) As Boolean
  133.     p1 = p2
  134.     b = CBool(p1)
  135. End Function

По другую сторону (типа главное приложение) примерно такой кот
  1. '    Copyright 2009, 2010 Makarov Andrey
  2. '
  3. '    This file is part of Audica - Open Simple Audio Player.
  4. '
  5. '    Audica is free software: you can redistribute it and/or modify
  6. '    it under the terms of the GNU General Public License as published by
  7. '    the Free Software Foundation, either version 3 of the License, or
  8. '    (at your option) any later version.
  9. '
  10. '    Audica is distributed in the hope that it will be useful,
  11. '    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. '    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. '    GNU General Public License for more details.
  14. '
  15. '    You should have received a copy of the GNU General Public License
  16. '    along with Audica.  If not, see <http://www.gnu.org/licenses/>.
  17.  
  18. Option Explicit
  19. Private Declare Function DefWindowProc Lib "user32.dll" Alias "DefWindowProcA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  20. Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
  21. Private Const WM_USER As Long = &H400
  22. Private Const WM_WHEEL As Long = (WM_USER + 1)
  23. Private Const WM_KEYS As Long = (WM_USER + 2)
  24. Private Const WM_REGHOOK As Long = (WM_USER + 3)
  25. Private Const WM_UNREGHOOK As Long = WM_REGHOOK
  26.  
  27. Private Declare Function CreateWindowEx Lib "user32.dll" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, ByRef lpParam As Any) As Long
  28. Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  29. Private Const GWL_WNDPROC As Long = -4
  30. Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  31. Private Declare Function DestroyWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
  32. Public wnd As Long, hookwnd As Long, dummy As Long, serverChecked As Boolean
  33. Private Const WINDOW_NAME As String = "Audica_Dummy"
  34.  
  35. 'Если не найден сервер \false\
  36. Public Function int_isClient() As Boolean
  37.     If Not serverChecked Then
  38.         If Not b(wnd, FindWindow(vbNullString, WINDOW_NAME)) Then _
  39.             int_becomeServer
  40.         serverChecked = True 'Флаг проверки
  41.     End If
  42.     int_isClient = wnd
  43. End Function
  44.  
  45. 'Стать сервером
  46. Private Sub int_becomeServer()
  47.     dummy = CreateWindowEx(0, "STATIC", WINDOW_NAME, 0, 0, 0, 0, 0, 0, 0, 0, ByVal 0)
  48.     SetWindowLong dummy, GWL_WNDPROC, AddressOf int_WindowProc
  49. End Sub
  50.  
  51. 'Выключить сервер (если int_isClient = false)
  52. Public Sub int_destroyServer_ifNotClient()
  53.     If Not int_isClient Then
  54.         DestroyWindow dummy
  55.     End If
  56. End Sub
  57.  
  58. Public Sub int_unhook()
  59.     If hookwnd Then _
  60.         SendMessage hookwnd, WM_UNREGHOOK, 0, 0
  61. End Sub
  62.  
  63. Private Function int_WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  64.     Dim cds As COPYDATASTRUCT
  65.     Select Case uMsg
  66.     Case WM_WHEEL:
  67.         '...
  68.     Case WM_KEYS:
  69.         '...
  70.     Case WM_REGHOOK:
  71.         hookwnd = lParam
  72. 'Case...
  73.     End Select
  74.     int_WindowProc = DefWindowProc(hwnd, uMsg, wParam, lParam)
  75. End Function

Ответить

Номер ответа: 8
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #8 Добавлено: 17.06.10 21:52
Еще есть Named Pipes, TCP

VBD пишет:
Он отсылал команды CrosswordCreator через реестр, и ждал ответа. А тот в другом ключе реестра отвечал. О как))

Клиника

Ответить

Номер ответа: 9
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #9
Добавлено: 17.06.10 21:55
Ой, а прям ты раньше не замечал. Раста, когда ты перестанешь удивляться? Я же не передаю через сетевой реестр поток MPEG4. Хотя...

Ответить

Номер ответа: 10
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #10 Добавлено: 17.06.10 21:57
можно сделать что-то проще лучше удобней, то расскажите)

а чем вариант с сокетами не приглянулся? всеж проще чем хукать оконные процедуры и создавать окна..

Ответить

Номер ответа: 11
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #11
Добавлено: 17.06.10 22:37
EROS, как с быстродействием у сокетов? я пересылаю нажатия всех клавиш, прокрутку колеса. Вообще это такая упоротая многопоточность)

Ответить

Номер ответа: 12
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #12 Добавлено: 17.06.10 23:52
Нормальный вариант использования многозадачности винды, работает без замечаний даже на семерке под гостем со влюченым уаком.
Но можно былобы и проще написать.

Ответить

Номер ответа: 13
Автор ответа:
 Dark Engine



ICQ: 343191665 

Вопросов: 51
Ответов: 98
 Web-сайт: www.wentas.2bb.ru
 Профиль | | #13
Добавлено: 18.06.10 09:28
Winand пишет:
как с быстродействием у сокетов?

Через сокет - тоже вариант. Причем, достаточно хороший. Только мне кажется, для работы на локальной машине тогда должна быть сеть или хотя бы виртуальный адаптер замыкания на себя... хотя... то, что я пишу будет запускаться на сервере и за сетью точно не завянет...

Ответить

Номер ответа: 14
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #14 Добавлено: 18.06.10 09:48
EROS, как с быстродействием у сокетов?

Ну насколько я понимаю тут идет взаимодействие 2+ программ в рамках одной машины, поэтому,имхо, быстродействия TCP тут вполне хватит.. объемы данных тоже минимальные..

Ответить

Номер ответа: 15
Автор ответа:
 Dark Engine



ICQ: 343191665 

Вопросов: 51
Ответов: 98
 Web-сайт: www.wentas.2bb.ru
 Профиль | | #15
Добавлено: 18.06.10 14:20
EROS пишет:
быстродействия TCP тут вполне хватит.. объемы данных тоже минимальные

А если надо будет перебросить таблицу из БД из одного приложения в другое? Формат придумать можно, но передача будет громоздкой

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам