COM und Python :-( / COM und VBA :-)

10/12/2008 - 00:02 von Andreas Bruhn | Report spam
Hi,

ich habe mir hier in einem DBMS eine kleine Klasse (COMtest) gebaut,
die durch das DBMS automatisch über COM zu erreichen ist. Eine Methode
der Klasse (testInt) liefert eine 42 zurück. Eine zweite Methode
(addOneInteger) erwartet ein Integer, addiert einen drauf und liefert
das Ergebnis zurück.

Nach einigen erfolglosen Python-Abenden hatte ich gestern mal VBA
unter Access angeworfen und folgende kleine Routine erfolgreich
(Debug.Print hatte wie gewünscht 43 ausgegeben) laufen lassen.

mit VBA geht es
Dim Fac As CacheObject.Factory
Dim obj As CacheObject.ObjInstance
Dim Status as Boolean

Public Sub eintest()
Set Fac = CreateObject("CacheObject.Factory")
Status = Fac.Connect("cn_iptcp:127.0.0.1[1972]:USER")
Set obj = Fac.New("Schnittstelle.COMtest")

Debug.Print obj.addOneInteger(obj.testInt)
End Sub



Also geht es wenigstens. So weit, so gut. Aber ich will ja eigentlich
mit Python arbeiten. Nur an den letzten Abenden ist immer nur
folgendes passiert:

- mit Python funktioniert COM nicht




from comtypes.client import CreateObject
fac = CreateObject('CacheObject.Factory')
fac.connect("cn_iptcp:127.0.0.1[1972]:USER")






True



obj = fac.New("Schnittstelle.COMtest")
obj.addOneInteger(obj.testInt)






Traceback (most recent call last):
File "<interactive input>", line 1, in ?
File
"D:\Programme\ActivePython243\Lib\site-packages\comtypes\client\dynamic.py",
line 85, in __getattr__
result = self._comobj.Invoke(dispid, _invkind=flags)
File
"D:\Programme\ActivePython243\Lib\site-packages\comtypes\automation.py",
line 628, in Invoke
raise COMError(hresult, text, details)
COMError: COMError(0x80020009, 'Ausnahmefehler aufgetreten.',
(u'<UNDEFINED>zaddOneInteger^Schnittstelle.COMtest.1', u'Cache
ObjectSystem', None, 0L, 0))



obj.testInt






42












Ich habe hier am Ende noch zusàtzlich die testInt-Methode aufgerufen
um zu zeigen dass ich wenigstens Methoden ohne Übergabe-Parameter
aufrufen kann und dass in Python überhaupt etwas funktioniert.

Die Fehlermeldung ist klar: Beim Aufruf von addOneInteger ist der
Übergabe-Parameter 'eingabe' nicht definiert bzw. es wird die 42 (oder
auch alles mögliche andere) nicht übergeben. Hier die Definition von
testInt und addOneInteger:

Method testint() As %Integer
{
Quit 42.23
}

Method addOneInteger(eingabe As %Integer) As %Integer
{
Set Wert=eingabe
Quit eingabe+1.0
}


Aber warum wird 'eingabe' nicht definiert/initialisiert? Was macht
comtypes so anders als VB(A)? :-((

Fragende Grüße,

Andreas
 

Lesen sie die antworten

#1 Thomas Rachel
10/12/2008 - 10:18 | Warnen spam
Andreas Bruhn schrieb:

obj.addOneInteger(obj.testInt)









Mach da mal ein () hinter testInt... addOneInteger will schließlich
einen Integer,also das, was obj.testInt() zurückgibt, nicht die Funktion
selbst...


Thomas

Ähnliche fragen