How can I work with pointers?

Darrell news at dorb.com
Wed May 9 23:37:20 EDT 2001


Thanks Neil!

calldll did the trick, now to figure out how this Director thing works :)

Get calldll built for Python21 here ==> http://ezwiki.com/python

--Darrell

#######################################################

import time, calldll
from win32api import *
from win32gui import *
import win32api, win32gui, win32con, struct, array

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

copyDataStruct="""IIP"""
"""32bit pointer, count, void pointer"""

class MainWindow:
    def __init__(self):
        self._msgs=[]
        self._ar=[]
        self._scite=[]
        id=RegisterWindowMessage("SciTEDirectorInterface")
        message_map = {
            id:self.OnDirector,
            win32con.WM_COPYDATA:self.OnDirector1
        }

        # Register the Window class.
        wc = WNDCLASS()
        hinst = wc.hInstance = GetModuleHandle(None)
        wc.lpszClassName = "SciteDirector test"
        wc.lpfnWndProc = message_map # could also specify a wndproc.
        classAtom = RegisterClass(wc)
        # Create the Window.
        style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU
        self.hwnd = CreateWindow( classAtom, wc.lpszClassName, style, \
                    0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, \
                    0, 0, hinst, None)
        UpdateWindow(self.hwnd)
        self.registerDirector()

    def packMsg(self, msg):
        # Don't want ar to go away while being sent to another window
        print 'Msg out:', msg
        ar=array.array('c',msg)
        self._ar.append(ar)
        msg=ar.buffer_info()
        cds = struct.pack(copyDataStruct,0, msg[1],msg[0])
        cds = array.array('c', cds)
        cds = cds.buffer_info()
        return cds

    def registerDirector(self):
        SDI = win32api.RegisterWindowMessage("SciTEDirectorInterface")
        w = win32gui.GetWindow(win32gui.GetDesktopWindow(),win32con.GW_CHILD
)
        cds = self.packMsg(":%s:macroenable:1"%self.hwnd)
        while (w):
            if (SDI == win32api.SendMessage(w, SDI, 0, 0)):
                #Replied with same SDI code so should
                #understand SDI's version of WM_COPYDATA
                win32api.SendMessage(w, win32con.WM_COPYDATA, self.hwnd ,
cds[0])
                self._scite.append(w)
            try:
                time.sleep(0)
                w = win32gui.GetWindow(w, win32con.GW_HWNDNEXT)
            except:
                w = None

        cmd="""
:%(hwnd)s:askfilename:
:%(hwnd)s:property:xyz=123
:%(hwnd)s:enumproperties:base:
:%(hwnd)s:find:win32api:
:%(hwnd)s:macrolist:
        """%{'hwnd':self.hwnd}

        self.perform(cmd)

    def perform(self, cmd):
        cds = self.packMsg(cmd)
        for w in self._scite:
            win32api.SendMessage(w, win32con.WM_COPYDATA, self.hwnd ,
cds[0])

    def OnDirector(self, hwnd, msg, wparam, lparam):
        print 'OnDirector', wparam, lparam
        if lparam == 0:
            return
        sz = struct.calcsize(copyDataStruct)
        s = calldll.read_string(lparam, sz)
        dwData, cbData, lpData = struct.unpack(copyDataStruct, s)
        s = calldll.read_string(lpData, cbData)
        print 'S:',s

    def OnDirector1(self, hwnd, msg, wparam, lparam):
        print 'OnDirector1'
        sz = struct.calcsize(copyDataStruct)
        s = calldll.read_string(lparam, sz)
        dwData, cbData, lpData = struct.unpack(copyDataStruct, s)
        s = calldll.read_string(lpData, cbData)
        print 'S:',s

def main():
    w=MainWindow()
    while 1:
        if PumpWaitingMessages():
            break
        time.sleep(0.1)

if __name__=='__main__':
    main()


################## output
Msg out: :1115962:macroenable:1
OnDirector 0 0
Msg out:
:1115962:askfilename:
:1115962:property:xyz=123
:1115962:enumproperties:base:
:1115962:find:win32api:
:1115962:macrolist:

OnDirector1
S: :1115962:filename:E:\\scite\\scite\\src\\SciTEBase.cxx
OnDirector1
S: :1115962:filename:E:\\scite\\director.py
OnDirector1
S: :1115962:filename:E:\\scite\\wscite\\scintilla.iface








More information about the Python-list mailing list