Seite 1 von 1

Mit Python auf DLL zugreifen.

Verfasst: Donnerstag 17. Februar 2005, 15:04
von 2bock
Hi zusammen.

Ich greife mit Python auf eine VB DLL zu. Klappt so eigentlich wunderbar. Nur Kann ich auch auf vb Properties zugreifen? Ich schaffe es nur auf Function zuzugreifen. Funktion heißt ungefähr so: "Public Property Get Status(......."

Also kann man von Python aus auf Properties in einer VB DLL auch zugreifen?

Greetz from 2bock :wink:

Verfasst: Donnerstag 17. Februar 2005, 15:16
von Leonidas
Hast du ctypes benutzt?

Nutze Win32Com

Verfasst: Donnerstag 17. Februar 2005, 15:19
von 2bock_not_logged
Nein ich möchte das ohne ctypes machen. Nur mit win32com.

Gruß 2bock

Verfasst: Donnerstag 17. Februar 2005, 15:49
von Leonidas
Wie sieht denn so ein Code aus, der deine DLL benutzt?

Verfasst: Freitag 18. Februar 2005, 09:08
von 2bock_not_logged
Die Dll heißt Test.dll
Die Klasse clsArchive
Die Funktion heißt TestFunction(), habe ich aber nur erstellt, um auf die Property (TestProperty()) in Visual Basic zugreifen zu können. Sie dürfte wenns geht ruhig wegfallen. Übergeben werden soll nur ein boolsches wahr.


Code: Alles auswählen

import win32com.client as wc

class TestClass:
    def __init__(self):
        self.objLicenceClass = wc.Dispatch("Test.clsArchive")

    def TestFunction(self):
        return self.objLicenceClass.TestFunction(bool(1)) 
        
    def TestProperty(self):
        value =  self.objLicenceClass.TestProperty(1)
        return value
        
TC = TestClass()
print TC.TestFunction()

Greetz und schon mal ein Danke von 2bock ;-)

Edit (Leonidas): Code in Python Tags gesetzt.

Verfasst: Freitag 18. Februar 2005, 21:22
von Leonidas
Ich habe da nicht wirklich Ahnung, aber versuch es doch mal mit value = self.objLicenceClass.TestProperty?

Ja stimmt

Verfasst: Dienstag 22. Februar 2005, 09:05
von 2bock_not_logged
Hi.

Also Du hast natürlich recht. so kann man eine Property ansprechen und daten zurückbekommen. Das klappt auf wunderbar, nur beim Propertyaufruf parameter übergeben, habe ich noch nicht geschafft.

Greetz 2bock.

Verfasst: Dienstag 22. Februar 2005, 15:02
von Leonidas
Also ich kenne mich mit VB (nicht mehr) aus, aber Versuch es doch mal so, self.objLicenceClass.TestProperty = value. Vielleicht geht ja pywin32 besser als man denken könnte.

Nein das geht auch nicht

Verfasst: Dienstag 1. März 2005, 14:29
von 2bock_not_logged
Nein. Leider funktioniert dies auch nicht. Ich bekomme abe nun folgende Fehlermeldung

Code: Alles auswählen

  File "MyLicence.py", line 24, in GetLicenceType
    self.objLicenceClass.LicenseType = 1
  File "D:\Python24\Lib\site-packages\win32com\client\dynamic.py", line 543, in __setattr__
    raise AttributeError, "Property '%s.%s' can not be set." % (self._username_, attr)
AttributeError: Property 'MyLicence.clsArchive.LicenseType' can not be set.
>Exit code: 1
Also so kann die Property nicht gesetzt werden. Schade.
Weiß vielleicht sonst noch jemand ne mögliche Lösung?

Greetz from 2bock

Verfasst: Dienstag 1. März 2005, 22:28
von BlackJack
Python-Properties funktionieren nur richtig, wenn man eine "New-Style" Klasse benutzt, also von `object`erbt. Hilft das vielleicht?

Vielleicht so?

Verfasst: Mittwoch 2. März 2005, 08:56
von 2bock_not_logged
Hi Black Jack.

Hättest Du vielleicht ein kleines Beispiel diesbezüglich?

Ich hab mal hier ein noch fehlerhaftes Beispiel im Netz gefunden, aber meinst Du das vielleicht so?

Code: Alles auswählen

>>> class C(object):
    def __init__(self):
        self.__x = 0
    def getter(self):
        return self.__x
    def setter(self, value):
        if value > 0:
            self.__x = value
        else:
            self.__x = 0
    def deleter(self):
        print "you can't delete x!"
    x=property(getter, setter, deleter)
    # now x is not a simple attribute, it's a managed property "object"


>>> c = C()
>>> c.x
0
>>> c.x = 9
>>> c.x
9
>>> del c.x
you can't delete x!
>>> c.x
9
>>> c.x =-9
>>> c.x
0

>>> c.__x
Grettz from 2bock :wink:

Ähm eher nicht

Verfasst: Mittwoch 2. März 2005, 10:33
von 2bock_not_logged
Wobei dies hier wohl eher die andere richtung sein wird. Quasi eine Property in Python erstellen und in VB ansprechen.