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]