Seite 1 von 1

PyHandle in ein natives Handle wandeln

Verfasst: Mittwoch 25. Juli 2007, 12:50
von HarryPython
Hi.

Ich erstelle mit win32event.CreateEvent(None,0,0,None) ein Handle.

Nun erstellt win32event ein PyHandle, was ein CreateEvent unter C aber nicht macht. Daher glaube ich, dass meine dll mit diesem PyHandle nichts anfangen kann. Gibt es eine Möglichkeit ein PyHandle in ein normales zu wandeln??

Da ich weiß, dass das CreateEvent Handle unter C nur aus einer Id besteht hab ich die auch schon aus dem PyHandle mit int(PyHandle) geholt. Die dll will einen Pointer auf das Handle(die Id). Wenn ich jetzt mit byref auf int(PyHandle) zeige sagt er "argument must be a ctypes instance, not int".

Kann mir jemand dazu was sagen? Danke

Verfasst: Mittwoch 25. Juli 2007, 12:57
von birkenfeld
Ich kann kaum glauben, dass deine DLL einen Pointer auf das Handle will, schließlich ist das Handle selbst ja (normalerweise) nur ein Pointer.

Oder ist das auch ein Ausgabeparameter?

Verfasst: Mittwoch 25. Juli 2007, 13:32
von HarryPython
Hi

Hier mal ein Beispiel aus der Anleitung zu der dll.
So soll das in C aussehen:

h = CreateEvent(NULL, FALSE, FALSE, NULL);
vErr = ncdSetNotification (gPortHandle,&h, 1);
// Wait for event
while (WaitForSingleObject(h,1000)==WAIT_TIMEOUT);
do {
vErr = ncdReceive1(gPortHandle,&pEvent); // Get the event
}while (vErr == 0);

Mit dem &h will es doch die Adresse von Handle haben oder verstehe ich das falsch?

Verfasst: Mittwoch 25. Juli 2007, 14:25
von BlackJack
Nein, das siehst Du richtig.

Verfasst: Mittwoch 25. Juli 2007, 15:16
von birkenfeld
Tatsächlich. Nun, dann ist wohl ein Fall für ctypes.pointer.

Verfasst: Mittwoch 25. Juli 2007, 15:33
von HarryPython
Das heißt???

Ich hatte das ja schon einmal mit einem pointer versucht, aber da kommt eine Fehlermeldung wie ich sie oben beschrieben hab.

Wobei man sagen muss dass C ja nur die Id zurück gibt und dann mit einem Pointer auf diese zeigt. In dem PyHandle von CreateEvent() steht ja aber schon eine Adresse drin, oder was soll das für ein int Wert sein?? Die 4-stellige Zahl, die in Klammern dahinter steht ist doch die Id. Somit hab ich ja für mein PyHandle schon eine Adresse?!?!

Wenn ich nur diesen Wert(Adresse) übergebe bekomme ich zwar keine Fehlermeldung mehr aber mein Waitforsingleobject() findet nichts.

Gruß Harry

Verfasst: Mittwoch 25. Juli 2007, 16:22
von BlackJack
Die Fehlermeldung ist doch recht deutlich: `byref()` erwartet ein `ctypes` Objekt, bekommt aber ein `int`. Du musst Deine Zahl in ein `ctypes.c_int` verpacken und darauf dann mit `byref()` den Pointer erzeugen und übergeben.

Das die Zahl *vielleicht* schon in irgendeiner Weise eine Adresse auf eine Windows-interne Datenstruktur darstellt, in welchem Adressraum auch immer, hat Dich als Programmierer nicht zu interessieren. Das könnte genau so gut ein Index in ein Array sein, oder die Quadratwurzel von Bill Gates Geburtstag als Unix-Timestamp + einer fortlaufenden Nummer. Der Sinn von solchen Handles ist es ja gerade die Implementierungsdetails zu verstecken.

Verfasst: Mittwoch 25. Juli 2007, 16:53
von HarryPython
:shock:

DAS WAR DIE LÖSUNG DES PROBLEMS !!!!!!!!!!!!!!!!!!!!!


Sitze da ja nur seit ein paar Tagen schon dran. lol

Cool. Danke!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


Sollte jemand auch so n Sch.. machen müssen, hier die Lösung:

Code: Alles auswählen

rxEventHandle = win32event.CreateEvent(None, 0, 0, None)
h = hash(rxEventHandle)
i = int(rxEventHandle)

...

vErr = candll.ncdSetNotification(port, byref(ctypes.c_int(i)), 1)
        print "SetNotication: "+str(vErr)

...

vErr = (win32event.WaitForSingleObject(self.i, 250))