Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: Обмен данными между приложениями Добавлено: 08.07.04 20:41  

Автор вопроса:  DaSharm | Web-сайт: dasharm.com | ICQ: 780477 
нужно устроить обмен данными между VB и C++ приложением. Вы что-то знаете по етой теме?(OLE, DDE не предлагать)

Ответить

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

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



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #1
Добавлено: 08.07.04 21:30
MSDN + WM_COPYDATA + Subclassing = ответ :)
Можно еще и RegisterWindowMessage использовать, но зачем если есть уже специально приготовленная для нас константа :)
Ну помимо WM_USER конечно же ;)

Если поискать, по этой константе, в MSDN то вполне можно найти как ее использовать и в VB...

Ответить

Номер ответа: 2
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #2
Добавлено: 08.07.04 22:57
у меня нет MSDN :(

Ответить

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



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #3
Добавлено: 09.07.04 00:20
забыл добавить, со стороны С++ выступает DLL, т. е. сабкласинг крайне тяжело будет организовать...не люблю с окнами работать. С сокетами - да, с процесами/потоками - пожалуйста, с окнами -ну не люблю и всё...

Ответить

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



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #4
Добавлено: 09.07.04 01:29
:) у меня как раз наоборот... противоположная ситуация... не люблю работать с сокетами, люблю окошки процессами :)

Даже в длл можно создать окошко... так что особых проблемм не вижжу в этом...
Кстати, на VB, организовал модуль я и тут в примерах есть... звать его, кажется, WndReseiver... если интересно глянь...

Ответить

Номер ответа: 5
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #5
Добавлено: 09.07.04 02:01
Все нижевзятое из MSDN...




WM_COPYDATA
An application sends the WM_COPYDATA message to pass data to another application.

To send this message, call the SendMessage function with the following parameters (do not call the PostMessage function).

SendMessage(
  ;(HWND) hWnd, // handle to destination window
  WM_COPYDATA, // message to send
  ;(WPARAM) wParam, // handle to window (HWND)
  ;(LPARAM) lParam // data (PCOPYDATASTRUCT)
);
Parameters
wParam
Handle to the window passing the data.
lParam
Pointer to a COPYDATASTRUCT structure that contains the data to be passed.
Return Values
If the receiving application processes this message, it should return TRUE; otherwise, it should return FALSE.

Remarks
The data being passed must not contain pointers or other references to objects not accessible to the application receiving the data.

While this message is being sent, the referenced data must not be changed by another thread of the sending process.

The receiving application should consider the data read-only. The lParam parameter is valid only during the processing of the message. The receiving application should not free the memory referenced by lParam. If the receiving application must access the data after SendMessage returns, it must copy the data into a local buffer.

When you send a WM_COPYDATA message, SendMessage allocates a block of memory cbData bytes in size and copies the data from the caller's address space to this block. It then sends the message to the destination window. When the receiving window procedure processes this message, the lParam parameter is a pointer to a COPYDATASTRUCT structure that exists in the address space of the receiving process. The lpData member is a pointer to the copied block of memory, and the address reflects the memory location in the receiving process's address space.

Requirements
  Windows NT/2000 or later: Requires Windows NT 3.1 or later.
  Windows 95/98/Me: Requires Windows 95 or later.
  Header: Declared in Winuser.h; include Windows.h.



-------------------------------------------------



COPYDATASTRUCT
The COPYDATASTRUCT structure contains data to be passed to another application by the WM_COPYDATA message.

typedef struct tagCOPYDATASTRUCT {
    ULONG_PTR dwData;
    ;DWORD cbData;
    PVOID lpData;
} COPYDATASTRUCT, *PCOPYDATASTRUCT;
Members
dwData
Specifies data to be passed to the receiving application.
cbData
Specifies the size, in bytes, of the data pointed to by the lpData member.
lpData
Pointer to data to be passed to the receiving application. This member can be NULL.




--------------------------------------




HOWTO: Pass String Data Between Applications Using SendMessage

Q176058


--------------------------------------------------------------------------------
The information in this article applies to:

Microsoft Visual Basic Learning, Professional, and Enterprise Editions for Windows, version 6.0
Microsoft Visual Basic Control Creation, Learning, Professional, and Enterprise Editions for Windows, version 5.0

--------------------------------------------------------------------------------


SUMMARY
There are many ways to achieve inter-process communication using Visual Basic. Unless you establish an OLE Automation client server relationship, string data is difficult to handle cleanly. The main reason is that 32-bit applications run in a separate address space, so the address of a string in one application is not meaningful to another application in a different address space. Using the SendMessage() API function to pass a WM_COPYDATA message avoids this problem.

This article demonstrates how to pass string data from one application to another by using the SendMessage API function with the WM_COPYDATA message.



MORE INFORMATION
WARNING: One or more of the following functions are discussed in this article; VarPtr, VarPtrArray, VarPtrStringArray, StrPtr, ObjPtr. These functions are not supported by Microsoft Technical Support. They are not documented in the Visual Basic documentation and are provided in this Knowledge Base article "as is." Microsoft does not guarantee that they will be available in future releases of Visual Basic.

Visual Basic does not support pointers and castings in the manner of Visual C++. In order to pass string data from one Visual Basic application to another, the Unicode string must be converted to ASCII prior to passing it to the other application. The other application must then convert the ASCII string back to Unicode.

The following summarizes how to pass string data from one application to another.

Step-by-Step Example
Convert the string to a byte array using the CopyMemory() API.


Obtain the address of the byte array using the VarPtr() intrinsic function and copy the address and length of the byte array into a COPYDATASTRUCT structure.


Pass the COPYDATASTRUCT to another application using the WM_COPYDATA message, setting up the other application to receive the message.


Unpack the structure on the target system using CopyMemory(), and convert the byte array back to a string using the StrConv() intrinsic function.


The next section shows you how to create a sample program that demonstrates passing string data from one application to another.
Steps to Create the Sample
To create this sample, you create two separate projects; a sending project and a target project.

Create the target application:
Start a new Standard EXE project in Visual Basic. Form1 is created by default. This project will be your target application.


Add a Label control to Form1.


Copy the following code to the Code window of Form1:



      Private Sub Form_Load()
          gHW = Me.hWnd
          Hook
          Me.Caption = "Target"
          Me.Show
          Label1.Caption = Hex$(gHW)
      End Sub

      Private Sub Form_Unload(Cancel As Integer)
          Unhook
      End Sub
Add a module to the project and paste the following code in the Module1 code window:



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

      Public Const GWL_WNDPROC = (-4)
      Public Const WM_COPYDATA = &H4A
      Global lpPrevWndProc As Long
      Global gHW As Long

      'Copies a block of memory from one location to another.

      ;Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
         ;(hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)

      ;Declare Function CallWindowProc Lib "user32" Alias _
         "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As _
         Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As _
         Long) As Long

      ;Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
         ;(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As _
         Long) As Long

      Public Sub Hook()
          lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, _
          AddressOf WindowProc)
          ;Debug.Print lpPrevWndProc
      End Sub

      Public Sub Unhook()
          ;Dim temp As Long
          temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
      End Sub

      Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, _
         ByVal wParam As Long, ByVal lParam As Long) As Long
          If uMsg = WM_COPYDATA Then
              Call mySub(lParam)
          End If
          WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, _
             lParam)
      End Function

      Sub mySub(lParam As Long)
          ;Dim cds As COPYDATASTRUCT
          ;Dim buf(1 To 255) As Byte

          Call CopyMemory(cds, ByVal lParam, Len(cds))

          Select Case cds.dwData
           Case 1
              ;Debug.Print "got a 1"
           Case 2
              ;Debug.Print "got a 2"
           Case 3
              Call CopyMemory(buf(1), ByVal cds.lpData, cds.cbData)
              a$ = StrConv(buf, vbUnicode)
              a$ = Left$(a$, InStr(1, a$, Chr$(0)) - 1)
              Form1.Print a$
          End Select
      End Sub
Save the project and minimize the Visual Basic IDE.


Create the Sending Application
Start a second instance of the Visual Basic IDE and create a new Standard EXE project in Visual Basic. Form1 is created by default.


Add a CommandButton to Form1.


Copy the following code to the Code window of Form1:



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

      Private Const WM_COPYDATA = &H4A

      Private Declare Function FindWindow Lib "user32" Alias _
         "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName _
         As String) As Long

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

      'Copies a block of memory from one location to another.
      Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
         ;(hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)

      Private Sub Command1_Click()
          ;Dim cds As COPYDATASTRUCT
          ;Dim ThWnd As Long
          ;Dim buf(1 To 255) As Byte

      ' Get the hWnd of the target application
          ThWnd = FindWindow(vbNullString, "Target";)
          a$ = "It Works!"
      ' Copy the string into a byte array, converting it to ASCII
          Call CopyMemory(buf(1), ByVal a$, Len(a$))
          cds.dwData = 3
          cds.cbData = Len(a$) + 1
          cds.lpData = VarPtr(buf(1))
          i = SendMessage(ThWnd, WM_COPYDATA, Me.hwnd, cds)
      End Sub

      Private Sub Form_Load()
      ' This gives you visibility that the target app is running
      ' and you are pointing to the correct hWnd
          Me.Caption = Hex$(FindWindow(vbNullString, "Target";))
      End Sub
Save the project.


Running the Sample
Restore the target application and press the F5 key to run the project. Note that the value of the hWnd displayed in the label.


Restore the sending application and press the F5 key to run the project. Verify that the hWnd in the form caption matches the hWnd in the label on the target application. Click the CommandButton and the text message should be displayed on the form of the target application.

Ответить

Номер ответа: 6
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #6
Добавлено: 09.07.04 07:32
Можно вообще, шоб одна прога сохраняла данные в файл или реестр, а другая читала... но это как-то по-ламерски :-)

Ответить

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



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #7
Добавлено: 09.07.04 10:31
2Morpheus, это способ начинающих ;)
имхо

Ответить

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



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #8
Добавлено: 09.07.04 14:48
Спасибо большое, sne. А ещё, никто не знает что такое MailSlot's???Я слышал, что ето типа тоже такая фигня для обмена данными между приложениями.

Ответить

Номер ответа: 9
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #9
Добавлено: 10.07.04 01:38
http://rsdn.ru/article/baseserv/ipc.xml

Ответить

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



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #10
Добавлено: 10.07.04 05:56
Почтовый слот напоминает службу доставки почты. Ты можешь отправить одному адресату сообщения из разных мест, но не можешь быть абсолютно уверены в их прибытии. APP создаёт в своей сис-ме почтовый слот с уникальным именем в формате \\.mailslot\mailslotname
Функции:
CreateMailslot
GetMailslotInfo
SetMailslotInfo
Надеюсь, что пригодится :-)

Ответить

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



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #11
Добавлено: 10.07.04 10:43
Спасибо, вчера нарыл уже инфу. А о Named Pipes кто-то не подкинет чего-то?(я конечно в гуглях поищу, но если кто чё знает то напишите)

Ответить

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



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #12
Добавлено: 12.07.04 09:16
Ребят, а никто случайно не знает, я вот DDE испльзую да(Ну там LinkTopic итд), а как мне сделать шоб приложения могли данными в сети обмениваться? Неужели тока через WinSock?

Ответить

Номер ответа: 13
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #13
Добавлено: 12.07.04 12:54
В глобальной только винсок апи.

Ответить

Страница: 1 |

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



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