PyWin SendMessage

g.franzkowiak g.franzkowiak at onlinehome.de
Thu Sep 29 13:15:18 EDT 2005


Thomas Heller schrieb:
> "g.franzkowiak" <g.franzkowiak at onlinehome.de> writes:
> 
> 
>>Hello everybody,
>>
>>I've tryed to use an interprocess communication via
>>SendMessage on Windows.
>>Unfortunately, nothing goes on
>>
>>#########################################################################
>>#! /usr/bin/env python
>>
>>import win32api, win32ui, win32con
>>import struct, array
>>
>>"""
>>typedef struct tagCOPYDATASTRUCT {  // cds
>>    DWORD dwData;
>>    DWORD cbData;
>>    PVOID lpData;
>>} COPYDATASTRUCT;
>>"""
>>
>>def packCopyData(nNum, sString):
>>    int_buffer  = array.array("L",[nNum])
>>    char_buffer = array.array('c', sString)
>>    int_buffer_address  = int_buffer.buffer_info()[0]
>>    char_buffer_address = char_buffer.buffer_info()[0]
>>    char_buffer_size    = char_buffer.buffer_info()[1]
>>    copy_struct = struct.pack("pLp",        # dword*, dword, char*
>>                              int_buffer_address,
>>                              char_buffer_size,
>>                              char_buffer)
>>    return copy_struct
> 
> 
> After packCopyData(...) returns, the arrays are destroyed, which will
> probably void their contents.  You must keep them alive until you don't
> need the COPYDATASTRUCT instance any longer.  For this kind of stuff,
> ctypes may be easier to use than pywin32.
> 
> Thomas

Hmm, have read something in <<http://aspn.activestate.com>>
and the script changed to this:

#---------------------------------------------------------
#! /usr/bin/env python

import win32api, win32ui, win32con, win32gui
import struct, array
from ctypes import *

"""
typedef struct tagCOPYDATASTRUCT {  // cds
    DWORD dwData;
    DWORD cbData;
    PVOID lpData;
} COPYDATASTRUCT;
"""

class COPYDATATYPE(Structure):
    _fields_ = [("nNum",   c_ulong),
                ("szData", c_char_p)]

class COPYDATASTRUCT(Structure):
    _fields_ = [("dwData", c_ulong),
                ("cbData", c_ulong),
                ("lpData", POINTER(COPYDATATYPE))]

# get the window handle
hwnd = win32ui.FindWindow(None, "target window")

# print just for fun
# ##print hwnd

# prepare copydata structure for sending data
cpyData = COPYDATATYPE(1, '1')
cds = COPYDATASTRUCT(c_ulong(1),
                     c_ulong(sizeof(cpyData)),
                     pointer(cpyData))

# try to send a message
win32api.SendMessage(hwnd,
                     win32con.WM_COPYDATA,
                     0,
                     pointer(cds))

#---------------------------------------------------------
and the message for the last line is:
==> TypeError: an integer is required"

This message comes with "pointer(cds)" and with "addressof(cds)"


gerd



More information about the Python-list mailing list