News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

Data Copy test

Started by MichaelW, March 26, 2007, 11:36:22 PM

Previous topic - Next topic

MichaelW

This is a test app that uses the WM_COPYDATA message to pass data between two processes (actually two separate instances of the same app). I did not try to determine the maximum number of bytes that can be transferred using this method, but under Windows 2000, 100000 bytes can be transferred without problems.

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    include \masm32\include\masm32rt.inc
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

    BUFFSIZE equ 100000
    TESTDATA equ 1

    .data

      hInstance         dd 0
      hWndEdit          dd 0
      hWndStatic        dd 0
      hWndOtherInstance dd 0
      instance2         dd 0
      cds               COPYDATASTRUCT <>
      inbuf  db         "<< ", 20 dup(0)
      outbuf db         ">> ", 20 dup(0)

    .data?

      buffer db BUFFSIZE dup(?)

    .code

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

DlgProc proc hDlg:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD

    Switch uMsg

      Case WM_INITDIALOG

        invoke GetDlgItem, hDlg, 101
        mov hWndEdit, eax
        invoke GetDlgItem, hDlg, 103
        mov hWndStatic, eax

        invoke SendMessage, hWndEdit, EM_SETLIMITTEXT, BUFFSIZE, 0

      Case WM_COMMAND

        mov eax, wParam
        mov edx, eax
        shr edx, 16

        .IF dx == BN_CLICKED && ax == 102
          .IF instance2
            mov hWndOtherInstance, rv(FindWindow, "#32770", "Data Copy 1")
          .ELSE
            mov hWndOtherInstance, rv(FindWindow, "#32770", "Data Copy 2")
          .ENDIF
          .IF hWndOtherInstance
            invoke GetWindowTextLength, hWndEdit
            inc eax                             ; include terminating null
            mov cds.cbData, eax
            .IF eax > 1 && eax <= BUFFSIZE
              invoke GetWindowText, hWndEdit, ADDR buffer, BUFFSIZE
              mov cds.dwData, TESTDATA
              mov cds.lpData, OFFSET buffer
              invoke SendMessage, hWndOtherInstance,
                                  WM_COPYDATA,
                                  hDlg,
                                  ADDR cds

              invoke crt__ultoa, cds.cbData, ADDR outbuf+3, 10
              invoke SetWindowText, hWndStatic, ADDR outbuf

            .ENDIF
          .ELSE
             fn SetWindowText, hWndStatic, "                     "
          .ENDIF
        .ENDIF

      Case WM_COPYDATA

        push ebx
        mov ebx, lParam
        .IF [ebx].COPYDATASTRUCT.dwData == TESTDATA
          invoke crt__ultoa, [ebx].COPYDATASTRUCT.cbData, ADDR inbuf+3, 10
          invoke SetWindowText, hWndStatic, ADDR inbuf
          invoke SetWindowText, hWndEdit, [ebx].COPYDATASTRUCT.lpData
        .ENDIF
        pop ebx

      Case WM_CLOSE

        invoke EndDialog,hDlg,0

    Endsw

    xor eax, eax
    ret

DlgProc endp

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
start:
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

    invoke GetModuleHandle, NULL
    mov hInstance, eax

    .IF rv(FindWindow, "#32770", "Data Copy 2") == 0
      .IF rv(FindWindow, "#32770", "Data Copy 1")

        inc instance2

        Dialog "Data Copy 2", \
               "MS Sans Serif",10, \
               WS_OVERLAPPED or WS_SYSMENU, \
               3,180,10,160,120,1024
      .ELSE

        Dialog "Data Copy 1", \
               "MS Sans Serif",10, \
               WS_OVERLAPPED or WS_SYSMENU, \
               3,10,10,160,120,1024
      .ENDIF

      DlgEdit WS_TABSTOP or WS_BORDER or ES_MULTILINE or \
              ES_WANTRETURN or WS_VSCROLL or WS_HSCROLL, \
              4,4,150,80,101

      DlgButton "Send",0,63,90,30,12,102

      DlgStatic " ",SS_LEFT,120,92,40,12,103

      CallModalDialog hInstance,0,DlgProc,NULL

    .ENDIF

    exit

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
end start




[attachment deleted by admin]
eschew obfuscation