Probleme beim einbindern einer DLL mit ctypes

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
CupraX
User
Beiträge: 4
Registriert: Samstag 13. Oktober 2007, 12:15

Samstag 13. Oktober 2007, 12:36

Hallo Liebe Forums Mitglieder,

seit einiger Zeit lese ich jetzt schon begeistert in diesem Forum mit und habe schon so mache Antwort hier gefunden. Jetzt hänge ich aber bei dem Versuch eine DLL mit ctypes ein zu binden fest. Leider habe ich bislang keine Lösung für das Problem finden könnnen.

Hier der Python Code mit dem ich versuche die Datei "IBHNETLib.dll" einzubinden. Ich bekomme immer einen Attribute Error. Könnte mir bitte jemand weiter helfen?
AttributeError: function 'Connect' not found

Code: Alles auswählen

import ctypes

dll = ctypes.windll.LoadLibrary("IBHNETLib.dll")

connect = dll.Connect()

#ibh = dll.IIBHnetClass()
#connect = dll.Connect("192.168.10.6", 2, 0, 0)
#connect = dll.IIIBHnet3.Connect()
#connect = dll.IIIBHnet3.Connect("192.168.10.6", 2, 0, 0)
Hier ein kurzes Beispiel, wie einige Funktionen der dll mit C# angesprochen werden:

Code: Alles auswählen

----------------------------------------
C# Beispiel
----------------------------------------

using IBHNETLib;
		
// Definition der IBHNet Verweise
private IBHNETLib.IIBHnetClass SPS = null;
private IBHNETLib.IIIBHnet2 SPS_2 = null;
private IBHNETLib.IIIBHnet3 SPS_3 = null;
        
// SPS Objekt Initialisieren und einen Verweis
// auf alle Interfaces erzeugen.
SPS = new IIBHnetClass();
SPS_2 = SPS;
PS_3 = SPS;

SPS_3.Connect_DP(PLCNames.Text.ToString(), nMpi, 0, 0);
Text = SPS.get_DW(12, 0).ToString();
SPS.Disconnect();
[/code]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 13. Oktober 2007, 13:42

Hallo CupraX, willkommen im Forum,

Das Problem scheint zu sein, dass das keine C-DLL ist, sondern eine .NET-DLL. Um diese anzusprechen musst du entweder IronPython verwenden (einen .NET-Port von Python) oder das CLR-Modul von Python .Net verwenden.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
CupraX
User
Beiträge: 4
Registriert: Samstag 13. Oktober 2007, 12:15

Donnerstag 18. Oktober 2007, 09:24

Hallo Leonidas

genau das scheint das Problem zu sein. Ich werde es mal mit IronPython versuchen. Aber wie es aussieht, muss ich die Funktionen nach Python portieren, da ich die Anwendung später unter einer Standard Python Installation verwenden möchte.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 18. Oktober 2007, 21:44

CupraX hat geschrieben:genau das scheint das Problem zu sein. Ich werde es mal mit IronPython versuchen. Aber wie es aussieht, muss ich die Funktionen nach Python portieren, da ich die Anwendung später unter einer Standard Python Installation verwenden möchte.
Keine Sorge, dank Brian Lloyd kannst du auch aus dem Standard-CPython .NET-Funktionen verwenden: das von mir angesprochene Python for .NET ermöglicht das.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
CupraX
User
Beiträge: 4
Registriert: Samstag 13. Oktober 2007, 12:15

Freitag 19. Oktober 2007, 13:44

Danke für den Hinweis. Habe mir gerade die Seite angeschaut und versucht es anzuwenden. Von der Webseite habe ich mir die Datei "pythonnet-2.0-alpha2.zip" heruntergeladen. Aus dem Verzeichnis "python2.5-UCS2" habe ich mir die beiden Dateien "clr.pyd" und "clr.so" kopiert. Versuche ich nun einen import, bekomme ich die folgende Fehlermeldung:
import clr
Import Error: dynamic module does not define init function (initclr)
Irgendwie stehe ich gerade auf dem Schlauch, wie kann ich nun auf die .NET DLL zugreifen ohne die "python.exe" aus dem Python for .NET Projekt zu verwenden, also mit einer Standard Installation von Python.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 19. Oktober 2007, 14:31

Hast du die README gelesen und die Suchmaschine befragt?

Ich kann es dir jetzt auch nicht mehr so genau sagen, weil ich Windows hinter mir gelassen habe. Aber wenn du wirklich gar nicht mehr weiterkommst, kannst du auch in die Mailingliste schreiben - die war damals, als ich dort angemeldet war ziemlich frequentiert.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 19. Oktober 2007, 14:46

CupraX hat geschrieben:Aus dem Verzeichnis "python2.5-UCS2" habe ich mir die beiden Dateien "clr.pyd" und "clr.so" kopiert.
Hallo CupraX!

Du brauchst auch die "python.exe" aus diesem Ordner. Dieses Python wurde so kompiliert, dass es auf die CLR zugreifen kann. Also entweder "python.exe" tauschen oder sicher stellen, dass explizit für dein Programm diese "python.exe" herangezogen wird.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
CupraX
User
Beiträge: 4
Registriert: Samstag 13. Oktober 2007, 12:15

Freitag 19. Oktober 2007, 15:01

Ja, habe die "python.exe" aus dem Python for .NET Packet verwendet. Damit bekomme ich meine .net DLL eingebunden und kann Sie verwenden. Allerdings habe ich dann mit einer "System.Runtime.InteropServices.COMException" zu kämpfen, wenn ich eine Funktion aus der DLL aufrufe. Schon komisch, sieht fast aus, als wäre ein COM Objekt in der .Net DLL. Habe leider nicht die Quellen zu dieser DLL.

Wäre halt schön gewesen, wenn man es auch mit einer Standard Python Installation funktioniert hätte. Egal, werde noch ein wenig versuchen herauszufinden, was diese Exception auslöst.

Hier mal der Code, welche die Exception auslöst, vielleicht hat ja noch jemand eine Idee, was hier schief läuft. Der auskommentiere Aufruf ist der Versuch die CLR Typen zu verwenden. Bringt aber die selbe Fehler Meldung.

Code: Alles auswählen

from System import String, Int32
from IBHNETLib import IIBHnetClass, IIIBHnet2, IIIBHnet3

SPS = IIBHnetClass()
SPS_2 = IIIBHnet2(SPS)
SPS_3 = IIIBHnet3(SPS)

conection = SPS_3.Connect_DP("192.168.10.6", 2, 0, 0)

plc_address = String("192.168.10.6")
dp_address = Int32(2)
rack = Int32(0)
slot = Int32(0)

#conection = SPS_3.Connect_DP(plc_address, dp_address, rack, slot)
[/code]
Antworten