Страница: 1 | 2 |
Вопрос: Сопряжение программ
Добавлено: 17.06.10 15:21
Автор вопроса: Dark Engine | Web-сайт: www.wentas.2bb.ru | ICQ: 343191665
Как обеспечить обмен данными между двумя (и более) программами на VB (работаю на 6).
Вопрос не слишком умный, но мне нужен именно
оптимизированный вариант.
Знаю, можно:
-через файл (медленно и не очень удобно)
-через буфер обмена (может перебиться инфа, если параллельно работать, скажем, в Word или редактировать программу)
Есть ли возможность посылать из одной программы в другую данные, желательно так, чтобы эти данные пришли именно в нужную программу? Через какие функции это реализуется?
Ответить
Номер ответа: 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
Если нижеследующая реализация плоха и можно сделать что-то проще лучше удобней, то расскажите)
Private Sub Form_Load()
If Not findServer Then End
Call hook
End Sub
Private Sub Form_Unload(Cancel As Integer )
Call unhook
Call destroyDummy
End Sub
Option Explicit
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
Private Const WM_USER As Long = &H400
Private Const WM_WHEEL As Long = (WM_USER + 1)
Private Const WM_KEYS As Long = (WM_USER + 2)
Private Const WM_REGHOOK As Long = (WM_USER + 3)
Private Const WM_UNREGHOOK As Long = WM_REGHOOK
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String , ByVal lpWindowName As String ) As Long
Private Const WINDOW_NAME As String = "Audica_Dummy"
Private Const HOOK_NAME As String = "HookTool_Dummy"
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
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hWnd As Long , ByVal nIndex As Long , ByVal dwNewLong As Long ) As Long
Private Const GWL_WNDPROC As Long = -4
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
Private Declare Function DestroyWindow Lib "user32.dll" (ByVal hWnd As Long ) As Long
Private wnd As Long , dummy As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long )
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
Public Declare Function UnhookWindowsHookEx Lib "USER32" (ByVal hHook As Long ) As Long
Private Declare Function CallNextHookEx Lib "USER32" (ByVal hHook As Long , ByVal nCode As Long , ByVal wParam As Long , lParam As Any) As Long
Private Const HC_ACTION = 0
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101
Private Const WM_SYSKEYDOWN = &H104
Private Const WM_SYSKEYUP = &H105
Private Const WH_KEYBOARD_LL = 13
Private Const WM_MOUSEWHEEL = &H20A
Private Const WH_MOUSE_LL As Long = 14
Private Type KBDLLHOOKSTRUCT
vkCode As Long
scanCode As Long
Flags As Long
time As Long
dwExtraInfo As Long
End Type
Private p As KBDLLHOOKSTRUCT
Private mou_rotat As Integer
Private kbd_hook_hndl As Long
Private mou_hook_hndl As Long
Public kbd_keys As New Collection
Public Sub hook()
kbd_hook_hndl = _
SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf km_hook_proc, App.hInstance, 0)
mou_hook_hndl = _
SetWindowsHookEx(WH_MOUSE_LL, AddressOf km_hook_proc, App.hInstance, 0)
End Sub
Public Sub unhook()
If kbd_hook_hndl <> 0 Then _
UnhookWindowsHookEx kbd_hook_hndl
kbd_hook_hndl = 0
If mou_hook_hndl <> 0 Then _
UnhookWindowsHookEx mou_hook_hndl
mou_hook_hndl = 0
End Sub
Public Function km_hook_proc(ByVal nCode As Long , ByVal wParam As Long , ByVal lParam As Long ) As Long
If nCode = HC_ACTION Then
Select Case wParam
Case WM_MOUSEWHEEL
CopyMemory mou_rotat, ByVal lParam + 10, 2
PostMessage wnd, WM_WHEEL, App.hInstance, CLng (Sgn(mou_rotat))
Case WM_KEYDOWN, WM_SYSKEYDOWN
CopyMemory p, ByVal lParam, Len(p)
If valByKey(p.vkCode) = -1 Then
kbd_keys.Add p.vkCode, CStr (p.vkCode)
PostMessage wnd, WM_KEYS, kbd_keys.Count, p.vkCode
End If
Case WM_KEYUP, WM_SYSKEYUP
CopyMemory p, ByVal lParam, Len(p)
If valByKey(p.vkCode) <> -1 Then _
kbd_keys.Remove CStr (p.vkCode)
PostMessage wnd, WM_KEYS, kbd_keys.Count, -p.vkCode
End Select
End If
km_hook_proc = CallNextHookEx(0, nCode, wParam, ByVal lParam)
End Function
Private Function valByKey(ByVal key As String ) As Long
On Error GoTo 1:
valByKey = kbd_keys.Item(key)
Exit Function
1: valByKey = -1
End Function
Private Function int_WindowProc(ByVal hWnd As Long , ByVal uMsg As Long , ByVal wParam As Long , ByVal lParam As Long ) As Long
If uMsg = WM_UNREGHOOK Then Unload Form1
int_WindowProc = DefWindowProc(hWnd, uMsg, wParam, lParam)
End Function
Public Function findServer() As Boolean
Dim prev As Long
If b(prev, FindWindow(vbNullString, HOOK_NAME)) Then _
PostMessage prev, WM_UNREGHOOK, 0, 0
If b(wnd, FindWindow(vbNullString, WINDOW_NAME)) Then
If dummy = 0 Then
dummy = CreateWindowEx(0, "STATIC" , HOOK_NAME, 0, 0, 0, 0, 0, 0, 0, 0, ByVal 0)
SetWindowLong dummy, GWL_WNDPROC, AddressOf int_WindowProc
End If
PostMessage wnd, WM_REGHOOK, App.hInstance, dummy
findServer = True
End If
End Function
Public Sub destroyDummy()
If dummy Then _
DestroyWindow dummy
End Sub
Private Function b(p1 As Long , p2 As Long ) As Boolean
p1 = p2
b = CBool (p1)
End Function
По другую сторону (типа главное приложение) примерно такой кот
Option Explicit
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
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
Private Const WM_USER As Long = &H400
Private Const WM_WHEEL As Long = (WM_USER + 1)
Private Const WM_KEYS As Long = (WM_USER + 2)
Private Const WM_REGHOOK As Long = (WM_USER + 3)
Private Const WM_UNREGHOOK As Long = WM_REGHOOK
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
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long , ByVal nIndex As Long , ByVal dwNewLong As Long ) As Long
Private Const GWL_WNDPROC As Long = -4
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String , ByVal lpWindowName As String ) As Long
Private Declare Function DestroyWindow Lib "user32.dll" (ByVal hwnd As Long ) As Long
Public wnd As Long , hookwnd As Long , dummy As Long , serverChecked As Boolean
Private Const WINDOW_NAME As String = "Audica_Dummy"
Public Function int_isClient() As Boolean
If Not serverChecked Then
If Not b(wnd, FindWindow(vbNullString, WINDOW_NAME)) Then _
int_becomeServer
serverChecked = True
End If
int_isClient = wnd
End Function
Private Sub int_becomeServer()
dummy = CreateWindowEx(0, "STATIC" , WINDOW_NAME, 0, 0, 0, 0, 0, 0, 0, 0, ByVal 0)
SetWindowLong dummy, GWL_WNDPROC, AddressOf int_WindowProc
End Sub
Public Sub int_destroyServer_ifNotClient()
If Not int_isClient Then
DestroyWindow dummy
End If
End Sub
Public Sub int_unhook()
If hookwnd Then _
SendMessage hookwnd, WM_UNREGHOOK, 0, 0
End Sub
Private Function int_WindowProc(ByVal hwnd As Long , ByVal uMsg As Long , ByVal wParam As Long , ByVal lParam As Long ) As Long
Dim cds As COPYDATASTRUCT
Select Case uMsg
Case WM_WHEEL:
Case WM_KEYS:
Case WM_REGHOOK:
hookwnd = lParam
End Select
int_WindowProc = DefWindowProc(hwnd, uMsg, wParam, lParam)
End Function
Ответить
Номер ответа: 13Автор ответа: Dark Engine
ICQ: 343191665 Вопросов: 51Ответов: 98
Web-сайт: www.wentas.2bb.ru Профиль | | #13
Добавлено: 18.06.10 09:28
Winand пишет:
как с быстродействием у сокетов?
Через сокет - тоже вариант. Причем, достаточно хороший. Только мне кажется, для работы на локальной машине тогда должна быть сеть или хотя бы виртуальный адаптер замыкания на себя... хотя... то, что я пишу будет запускаться на сервере и за сетью точно не завянет...
Ответить
Номер ответа: 15Автор ответа: Dark Engine
ICQ: 343191665 Вопросов: 51Ответов: 98
Web-сайт: www.wentas.2bb.ru Профиль | | #15
Добавлено: 18.06.10 14:20
EROS пишет:
быстродействия TCP тут вполне хватит.. объемы данных тоже минимальные
А если надо будет перебросить таблицу из БД из одного приложения в другое? Формат придумать можно, но передача будет громоздкой
Ответить
Страница: 1 | 2 |
Поиск по форуму