PyHandle in ein natives Handle wandeln

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.
HarryPython
User
Beiträge: 60
Registriert: Freitag 8. Juni 2007, 07:39

PyHandle in ein natives Handle wandeln

Beitragvon HarryPython » Mittwoch 25. Juli 2007, 12:50

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
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Mittwoch 25. Juli 2007, 12:57

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?
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
HarryPython
User
Beiträge: 60
Registriert: Freitag 8. Juni 2007, 07:39

Beitragvon HarryPython » Mittwoch 25. Juli 2007, 13:32

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?
BlackJack

Beitragvon BlackJack » Mittwoch 25. Juli 2007, 14:25

Nein, das siehst Du richtig.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Mittwoch 25. Juli 2007, 15:16

Tatsächlich. Nun, dann ist wohl ein Fall für ctypes.pointer.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
HarryPython
User
Beiträge: 60
Registriert: Freitag 8. Juni 2007, 07:39

Beitragvon HarryPython » Mittwoch 25. Juli 2007, 15:33

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
BlackJack

Beitragvon BlackJack » Mittwoch 25. Juli 2007, 16:22

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.
HarryPython
User
Beiträge: 60
Registriert: Freitag 8. Juni 2007, 07:39

Beitragvon HarryPython » Mittwoch 25. Juli 2007, 16:53

: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))


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]