Mit Python auf DLL zugreifen.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
2bock
User
Beiträge: 94
Registriert: Freitag 12. September 2003, 07:58
Wohnort: 50.9333300 / 6.3666700

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:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hast du ctypes benutzt?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
2bock_not_logged

Nein ich möchte das ohne ctypes machen. Nur mit win32com.

Gruß 2bock
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wie sieht denn so ein Code aus, der deine DLL benutzt?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich habe da nicht wirklich Ahnung, aber versuch es doch mal mit value = self.objLicenceClass.TestProperty?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
Zuletzt geändert von Leonidas am Dienstag 1. März 2005, 14:34, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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
BlackJack

Python-Properties funktionieren nur richtig, wenn man eine "New-Style" Klasse benutzt, also von `object`erbt. Hilft das vielleicht?
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:
2bock_not_logged

Wobei dies hier wohl eher die andere richtung sein wird. Quasi eine Property in Python erstellen und in VB ansprechen.
Antworten