[IronPython] COM Question

Alex Henderson alex at syzmk.com
Wed Nov 8 22:52:05 CET 2006


So is your problem that the instance returned by the repository for your
Model is just an uninitalized COM object i.e., if you went:

model = m_Repository.Models.GetAt(0)
help(model)

Do you end up seeing something like:

Help on __ComObject in module System in mscorlib, Version=2.0.0.0,
Culture=neutr
al, PublicKeyToken=b77a5c561934e089

 |      CreateObjRef(...)
 |              ObjRef CreateObjRef(self, Type requestedType)
 |      Equals(...)
 |              bool Equals(self, object obj)
 |      Finalize(...)
 |              Finalize(self)
 |      GetHashCode(...)
 |              int GetHashCode(self)
 |      GetLifetimeService(...)
 |              object GetLifetimeService(self)
 |      GetType(...)
 |              Type GetType(self)
 |      InitializeLifetimeService(...)
 |              object InitializeLifetimeService(self)
 |      MemberwiseClone(...)
 |              MarshalByRefObject MemberwiseClone(self, bool cloneIdentity)
 |              object MemberwiseClone(self)
 |      ToString(...)
 |              str ToString(self)
 |      __init__(...)
 |              x.__init__(...) initializes x; see x.__class__.__doc__ for
signature
 |              x.__init__(...) initializes x; see x.__class__.__doc__ for
signature

With none of the additional members you expected that Model to expose...?

-----Original Message-----
From: users-bounces at lists.ironpython.com
[mailto:users-bounces at lists.ironpython.com] On Behalf Of Nenad
Sent: Thursday, 9 November 2006 10:23 a.m.
To: users at lists.ironpython.com
Subject: [IronPython] COM Question

Hello everybody,

I'm using IronPython to automate Enterprise Architect (an UML Tool) via COM.

I've translated the VB.Net code from their examples to Python, in order to
get hold of some objects (diagrams and elements in diagrams etc.).

from System import Console, Object
import clr
clr.AddReference("EA.dll")
from EA import AppClass

def RunAll():
        App = AppClass() 
        m_Repository = App.Repository
        m_Repository.OpenFile(r"d:\Projekti\UML\Automotive Testing
Exploration.eap")
        #use the Repository in any way required
        DumpModel(m_Repository)

        m_Repository.Exit()
        m_Repository = None
 
def DumpModel(m_Repository):
        for idx in range (0, m_Repository.Models.Count):
                DumpPackage("",m_Repository.Models.GetAt(idx))
                Console.WriteLine("" + m_Repository.Models.GetAt(idx).Name)

def DumpPackage(Indent, Package):
        """output package name, then element contents, then process child
packages"""
        Console.WriteLine(Indent + Package.Name)
        DumpElements(Indent + "    ", Package)

        for idx in range(0,Package.Packages.Count):
                DumpPackage(Indent + "    ", Package.Packages.GetAt(idx))
.....

I get the following error:
  File C:\IronPython-1.0\Tutorial\ea_go.py, line 35, in Initialize
  File C:\IronPython-1.0\Tutorial\ea_go.py, line 11, in RunAll
  File C:\IronPython-1.0\Tutorial\ea_go.py, line 18, in DumpModel
  File C:\IronPython-1.0\Tutorial\ea_go.py, line 23, in DumpPackage
SystemError: Der Objektverweis wurde nicht auf eine Objektinstanz
festgelegt.

So basically it says, m_Repository.Models.GetAt(idx) is not Object, because
m_Repository.Models is not initialized.

Uuups. It seems IronPython doesn't cope with all COM nuances as well as
VB.Net does?

I'd bee greatefull for a clue.
Thanks to all in advance!
Nenad

P.S. The corresponding VB.Net code works just fine:

Module Module1
    Dim f As Object
    Sub Main()
        Call Run()
    End Sub
    ''class level variable for Repository

    Public m_Repository As Object

    Public Sub Run()
        'Microsoft.VisualBasic.FileOpen(1, "c:\Temp\ea_mdl.txt",
OpenMode.Append)
        ''create the repository object
        m_Repository = CreateObject("EA.Repository")
        ''open an EAP file
        m_Repository.OpenFile("d:\Projekti\UML\Automotive Testing
Exploration.eap")
        ''use the Repository in any way required
        DumpModel()
        ''close the repository and tidy up
        m_Repository.Exit()
        m_Repository = Nothing
        Console.WriteLine("Wir sind durch")
    End Sub

    Sub DumpModel()
        Dim idx As Integer
        For idx = 0 To m_Repository.Models.Count - 1
            DumpPackage("", m_Repository.Models.GetAt(idx))
        Next
    End Sub

    'output package name, then element contents, then process child packages
    Sub DumpPackage(ByVal Indent As String, ByVal Package As Object)
        Dim idx As Integer
        Console.WriteLine(Indent + Package.Name)
        'WriteLine(Indent + Package.Name)
        DumpElements(Indent + "    ", Package)
        For idx = 0 To Package.Packages.Count - 1
            DumpPackage(Indent + "    ", Package.Packages.GetAt(idx))
        Next
    End Sub
.....
End Module






_______________________________________________
users mailing list
users at lists.ironpython.com
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com




More information about the Ironpython-users mailing list