Pointer für Variable[]...

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
BlackJack

@funkheld: Als ich das letzte mal von `s` geredet habe, da gab es das noch! Du hast erst *danach* Quelltext gezeigt, wo Du den Wert von ``f.read(laenge)`` direkt als Argument von `create_string_buffer()` verwendet hast.

Das ändert aber auch nichts an dem Vorgang den ich beschrieben habe. Eine Kopie wird an der Stelle trotzdem von `create_string_buffer()` gemacht, denn Zeichenketten sind in Python nun einmal unveränderbar.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@funkheld:
ProcedureDLL und ProcedureCDLL stehen für die Aufrufkonvention (calling convention), mit der die Funktionen in PureBasic versehen werden (hab ich auch nur aus dem PureBasic-Forum, keine Garantie bzgl. Richtigkeit). Gerade weil Du offensichtlich mit inline-Assembler rumhantieren möchtest, solltest Du die Konventionen kennen und die Register- und Stackbehandlung richtig vornehmen, ansonsten geht Dein Programm mit dem Laden Deiner oder fremder DLLs baden (spätestens beim Rücksprung aus einer Funktion der DLL kann der Stackframe korrupt werden oder als sicher angenommene Register enthalten Unsinn). Die Fehlersuche kann dann sehr müßig werden und segfaults sind vorprogrammiert.
In PureBasic stehen ProcedureDLL für stdcall und ProcedureCDLL für cdecl. Für beides hat ctypes einen entsprechenden Lademechanismus (windll vs. cdll).

Wie Du siehst, sind die calling conventions nicht nur was fürs Jungvolk, sondern eher ein Problem Deiner low-level-Herangehensweise. Im Übrigen sind fast alle WinAPI-Funktionen stdcall. Näheres dazu in den WinAPI-Docs.

Edit:
Noch ein Wort zum Benutzen Deiner DLLs. Falls Du vorhast, diese von mehreren Prozessen oder gar Threads aus zeitgleich shared einzubinden und zu benutzen, musst Du sehr sorgfältig bei deren Programmierung sein, damit sie nebeneffektsfrei ihren Dienst tun. (Stichwort zum googlen: reentrant)
Antworten