Seite 1 von 1

Probleme beim einbindern einer DLL mit ctypes

Verfasst: Samstag 13. Oktober 2007, 12:36
von CupraX
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]

Verfasst: Samstag 13. Oktober 2007, 13:42
von Leonidas
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.

Verfasst: Donnerstag 18. Oktober 2007, 09:24
von CupraX
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.

Verfasst: Donnerstag 18. Oktober 2007, 21:44
von Leonidas
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.

Verfasst: Freitag 19. Oktober 2007, 13:44
von CupraX
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.

Verfasst: Freitag 19. Oktober 2007, 14:31
von Leonidas
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.

Verfasst: Freitag 19. Oktober 2007, 14:46
von gerold
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
:-)

Verfasst: Freitag 19. Oktober 2007, 15:01
von CupraX
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]