Argument Übergabe 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.
BlackJack

antimicro hat geschrieben:

Code: Alles auswählen

def Array(length,typecode='L',item=[0]): 
     """Erstellt ein Array dem typecode entsprechend.""" 
     return array.array(typecode, item * length)

DriverIDArray = Array(10)
Damit bekomme ich mein Array das ich dann der Funktion übergebe:

Code: Alles auswählen

DriverNum = yasdi.yasdiGetDriver(DriverIDArray.buffer_info()[0],maxDriverIDs)
Ich weiss nicht, ob das so funktioniert. Eigentlich sollte es, weil keine Typprüfung vorgenommen wird, aber das was Du von `buffer_info()` zurückbekommst ist ein Integer und die Funktion sollte einen Zeiger bekommen. Ich habe mal hiermit experimentiert:

Code: Alles auswählen

void reverse(char *start, unsigned int length)
{
    char tmp;
    char *end = start + (length - 1);
    
    while (start < end) {
        tmp = *start;
        *start++ = *end;
        *end-- = tmp;
    }
}
Das als Shared Library übersetzt und dann damit benutzt:

Code: Alles auswählen

import array
import ctypes

test_so = ctypes.cdll.LoadLibrary('./test.so')
reverse = test_so.reverse
reverse.argtypes = (ctypes.c_char_p, ctypes.c_uint)
reverse.restype = None

# 
# The trailing zero byte is just there to be able to print the pointer object.
# 
data = array.array('c', '123456\x00')
print '        data:', data

data_pointer = ctypes.c_char_p(data.buffer_info()[0])
print 'data_pointer:', data_pointer

length = 4
print '\nreversing first %d chars...\n' % length
reverse(data_pointer, length)
print '        data:', data
print 'data_pointer:', data_pointer
Funktioniert prima. `argtypes` und `restype` muss man nicht zwingend setzen, würde ich aber empfehlen wenn man die importierte Funktion öfter benutzt.
baesi
User
Beiträge: 5
Registriert: Mittwoch 7. November 2007, 21:29

Hallo

Ich bin noch Anfaenger mit Python und sollte in ein bestehendes Programm eine zusätzliche Funktion implementieren welche mir ziemliches Kopfzerbrechen bereitet. Ev. kann mir ja jemand weiterhelfen :?:

Ich habe eine Applikation welche mit Python3.2 via API angesteuert wird. Dies funktioniert auch ziemlich gut. Es besteht nun die Möglichkeit via einer dll eine weiter Verbindung mit der Applikation herzustellen um einen erweiterten Funktionsumfang zu erhalten.

Um die dll anzusteuern habe ich ctypes runtergeladen und installiert.
Damit kann ich die dll laden.

Für die Initialisierung der dll soll eine Funktion mit einem Übergabeparameter aufgerufen werden. und genau dort liegt das Problem:

Die Funktion sieht so aus:

Bool Call_Conv Funktion( LPDISPATCH Parameter)

Den Parameter welchen ich zu Verfügung habe ist ein Python <COMObject>. Er soll als Pointer auf ein Dispatch Objekt(wie erwähnt ComObjekt) übergeben werden.

Ich weiss nun einfach nicht wie ich mein Com Objekt in eine Dispatch Form bringen kann. Leider habe ich mit c überhaupt keine Erfahrung. :(

Ich hoffe Ihr wisst eine Lösung.

Besten Dank im voraus.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Klingt nach einer C++ Dll (ComObjekt als Parameter), mit ctypes gehen aber nur C Dlls.

Gruss
baesi
User
Beiträge: 5
Registriert: Mittwoch 7. November 2007, 21:29

hallo rayo

besten dank für deine infos. was gäbe es denn für möglichkeiten um mein problem zu lösen. ich brauche von der dll neun von unzähligen funktionen um meine applikation zu verfollständigen.

ich weiss nicht ob es möglich wäre einen c wrapper für die c++ dll zu schreiben. oder wäre ein anderer ansatz besser?

für euere hilfe danke ich im voraus
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du kannst gleich ein in C++ geschriebenes Modul machen, das auf die DLL zugreift und sich als Python-Modul verwenden lässt. Oder du lässt dir von SIP helfen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
baesi
User
Beiträge: 5
Registriert: Mittwoch 7. November 2007, 21:29

Besten Dank

Werde die Lösungsvorschläge mal genauer studieren
mrib
User
Beiträge: 1
Registriert: Mittwoch 23. Januar 2008, 09:56

Hallo zusammen

Ich habe dasselbe Problem wie baesi:
Eine C Funktion (nicht C++) in einer DLL verlangt als Parameter eine "LPDISPATCH" Variable (Pointer auf ein IDispatch Objekt). Haben tue ich aber nur ein "COMObject".

Die Frage ist also: wie kriege ich aus einem COMObject eine LPDISPATCH variable?

Die Ausgabe von o._oleobj_ zeigt, dass es sich um ein PyIDispatch Objekt handelt...

Wer könnte baesi und mir helfen?
Antworten