Huayang Xia schrieb: > I am trying to use ctypes to call dll functions. One of the functions > requires argument "struct IDispatch* ". I do have a PyIDispatch object > in python. How can I convert this "PyIDispatch object" to "struct > IDispatch* "? > Thanks in advance.
The only way (that I know of) to retrieve the 'IDispatch*' pointer from the PyIDispatch object is to print it: >>> from win32com.client import Dispatch >>> ie = Dispatch("InternetExplorer.Application") >>> print ie Windows Internet Explorer >>> repr(ie) '<COMObject InternetExplorer.Application>' >>> print ie._oleobj_ <PyIDispatch at 0xb17fb4 with obj at 0x27005c> >>> The last number is the pointer in question, you can parse it from the repr and pass it to the ctypes function call. For fun, attached is a script that creates a comtypes IDispatch pointer from the PyIDispatch object. Thomas <snip> # Shows how to convert an pywin32 PyIDispatch object # into a comtypes COM pointer. from win32com.client import Dispatch d = Dispatch("InternetExplorer.Application") x = d._oleobj_ print repr(x) # repr(x) is like this: # <PyIDispatch at 0xb12fac with obj at 0x2700b4> # # The last number is the address of the IDispatch pointer: addr = int(repr(x).split()[-1][2:-1], 16) print hex(addr) from ctypes import * from comtypes.automation import IDispatch from _ctypes import CopyComPointer # create a NULL comtypes pointer p = POINTER(IDispatch)() # put the IDispatch pointer into the comtypes IDispatch # pointer: cast(byref(p), POINTER(c_void_p))[0] = addr # Call AddRef(), since the comtypes pointer will call Release() when # it goes away: p.AddRef() print p <snip/> _______________________________________________ python-win32 mailing list python-win32@python.org http://mail.python.org/mailman/listinfo/python-win32