Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > How to return a IStream COM object?

Thread Tools

How to return a IStream COM object?

Posts: n/a
Hello all,

I have developed an automation server using Mark's win32 extensions
and I must return a IStream COM object from one method of the
automation server.

Here is an extract of my code:

class Stream:
_public_methods_ = [ 'Read', 'Write', 'read', 'write',
'Seek', 'SetSize', 'CopyTo',
'Commit', 'Revert', 'LockRegion', 'UnlockRegion',
'Stat', 'Clone']
_com_interfaces_ = [ pythoncom.IID_IStream ]

def __init__(self, mode, data):
print "init stream"
self._data = data
self._ptr = 0
self._size = len(data)
self._creationTime = Time(time())
self._accessTime = Time(time())
self._modificationTime = Time(time())
self._mode = mode

def Read(self, numBytes):
"""Read the specified number of bytes from the string"""
self._accessTime = Time(time())
data = self._data[self._ptr:self._ptr + numBytes]
self._ptr = self._ptr + numBytes
if self._ptr > len(self._data): self._ptr = len(self._data) - 1
print "Read data", data
return data # string
read = Read

def Write(self, data):
"""Write data to stream"""
self._modificationTime = Time(time())
print "Write data", data
self._data = self._data + data
write = Write

def Seek(self, offset, origin):
"""Changes the seek pointer to a new location"""
self._ptr = offset + origin
return self._ptr # ULARGE_INTEGER

def SetSize(self, newSize):
"""Changes the size of the stream object."""
self._size = newSize

def CopyTo(self, stream, cb):
"""Copies a specified number of bytes from the
current seek pointer in the stream to the current
seek pointer in another stream"""
data = self._data[self._ptr:self._ptr+cb]
return len(data) # ULARGE_INTEGER

def Commit(self, flags):
"""Ensures that any changes made to a stream object
open in transacted mode are reflected in the parent storage"""

def Revert(self):
"""Discards all changes that have been made to a
transacted stream since the last PyIStream::Commit call"""

def LockRegion(self, offset, cb, lockType):
"""Restricts access to a specified range of bytes
in the stream"""

def UnlockRegion(self, offset, cb, lockType):
"""Removes the access restriction on a range of bytes
previously restricted with PyIStream::LockRegion"""

def Clone(self):
"""Creates a new stream object with its own seek pointer
that references the same bytes as the original stream"""
# not yet implemented
return # PyIStream

def Stat(self, grfStatFlag):
"""Returns information about the stream"""
st = ('stream', STGTY_STREAM, self._size, self._modificationTime,
self._creationTime, self._accessTime, self._mode, LOCK_EXCLUSIVE,
return st # STATSTG

class AutomationServer:
def GetStream(self):
from win32com import storagecon
_grfMode_READ = storagecon.STGM_SHARE_EXCLUSIVE | \
storagecon.STGM_DIRECT | \
_grfMode_WRITE = storagecon.STGM_SHARE_EXCLUSIVE | \
s = XMLRPCLib2.Stream(_grfMode_WRITE, '')
return wrap(s, pythoncom.IID_IStream, useDispatcher=useDispatcher)

I'm trying to use this automation server in the Navision ERP. Navision
accepts the return value VT_UNKNOWN and maps it to an Navision
internal type InStream or OutStream. These types must be standard
IStream COM objects.
Since I'm using a correct typelib calling GetStream does not generate
a exception, the problem appears when I call a method of the Navision
type InStream/OutStream accessing the Stream methods. The error
message says something like "The is an problem communicating with the
stream". The python trace collector says nothing.

Since there are working automation servers that returns a IStream COM
object for Navision, I think there must be an error in my Stream
class. I suppose that python maps the native IStream methods to the
PyIStream methods in order to avoid using the pointers of the native

I made some test using pythoncom._univgw in order to create a vtable
for the IStream COM object, but the function CreateTearOff crashes
python. So, running after changing the line "import
univgw" to "from pythoncom import _univgw as univgw" crashes python. A
bug? Can anybody confirm this?

Can anybody help me? Maybe a working example?
Reply With Quote

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off

Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
Does the C++ standard define the global function of " istream&operator >>(istream& in, string& str); "? xmllmx C++ 5 06-15-2010 11:57 AM
what value does lack of return or empty "return;" return Greenhorn C Programming 15 03-06-2005 08:19 PM
Re: istream::getline Victor Bazarov C++ 0 08-13-2003 09:39 PM
overloaded >> and istream delimiters Todd Beauchemin C++ 1 07-31-2003 05:53 PM