Auf externe C source datei zugreifen

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.
Antworten
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Hi,

entschludigt bitte, für viele dürfte dies wohl ein triviales Problem sein aber irgendwie verstehe ich es überhaupt nicht.
Es geht darum das ich hier ein Gerät stehen habe das per USB an den PC angeschlossen ist.
Darauf will ich nun Zugreifen, ich habe vom Hersteller ein paar .h Datei bekommen und eine VC++ Project Datei mit der der das ganze sich in ein Demoprogramm verwandeln lässt.
Nur muss ich für das ganze nicht C(wovon ich überhaupt keine Ahnung habe) verwenden sondern python.
Ich muss also irgendwie auf die mitgelieferten C Funktionen zugreifen.
Gut, also erstmal http://docs.python.org/extending/extending.html geschnappt und gelesen und dann einen blick in die NAKAlib.h, die nach der Dokumentation die API für den Außenzugriff definiert, riskiert

Code: Alles auswählen

#ifndef __NAKALIB_DEF_H
#define __NAKALIB_DEF_H
#include "NAKAoslib.h"
#include "NAKAtypes.h"

NAKA_DLL_API NAKA_API NAKA_Init( short BdNum, int32_t *handle);

NAKA_DLL_API NAKA_API NAKA_End( int32_t handle);
Okay, ich muss jetzt also jede dieser Funktionen so wrappen das mein Python Objekt in einen C Wert umgewandlet wird, die Funktion ausführen und dass ganze dann nochmal rückwerts.
Aber hier werden doch als Returnwerte eigene typen verwendet oder?
Wie gebe ich das den in Python an? Die Seite gibt mir doch nur i,s,l, usw, aber keine Möglichkeit eigene zu definieren?
Ist das überhaupt der richtige Weg oder mache ich was grob falsch??

Ein total verwirrter Hawky
BlackJack

@p90: Wenn Du von C gar keine Ahnung hast, dann hast Du hier ein Problem. Denn wenn man tatsächlich selber eine Erweiterung in C schreiben möchte, braucht man a) Ahnung von C, b) Ahnung von Python, und c) ein wenig Ahnung davon wie CPython intern funktioniert — was auch wieder auf C-Kenntnisse hinaus läuft.

Selbst wenn man eine DLL mittels `ctypes` anbindet, was IMHO wesentlich einfacher ist, braucht man C-Kenntnisse um die Header-Dateien lesen/verstehen zu können.

Ansonsten: Wenn in C eigene Typen verwendet werden, bedeutet das ja nur, dass dort Typen aus den Grunddatentypen von C zusammen gesetzt wurden, oder Grunddatentypen ein alternativer Name gegeben wurde.
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Naja, von wollen kann hier keine rede sein, ich muss halt leider von diesem Gerät Daten holen und das geht nur über
dieses Zeug.

Ctypes hatte ich auch schon gesehen aber das geht doch nur mit dlls oder? Und die habe ich ja nicht sondenr nur die lib.h.
Und um daraus eine dll zu machen fehlen mir die Kentnisse.

Zu meinen C Kentnissen:
Ich hab schonmal einen Tutorial dazu gelesen aber nachdem ich ein einfaches Programm geschrieben hatte (sowas wie "Berechne T1/2 für ein Pendel") und mir angesehen habe wie eklig das wird bin ich dann doch zu python gegangen.
Aber halt nichts komplexes, keine pointer etc.
BlackJack

@p90: *.h-Dateien enthalten nur eine Schnittstellenbeschreibung. Nur damit alleine kannst Du auch in C nichts anfangen. Da die Header-Datei ``NAKAlib.h`` heisst — ”lib” ist als kurzform für ”library” (Bibliothek) üblich — und ”DLL” (”Dynamic Link Library”) dort in Makronamen oder definierten Typen vorkommt, hast Du sicher irgendwo eine passende DLL-Datei dazu. Und die lässt sich wahrscheinlich mit `ctypes` einfacher ansprechen als wenn Du eine C-Erweiterung schreibst, die auch auf diese DLL zugreifen müsste.
problembär

p90 hat geschrieben:Darauf will ich nun Zugreifen, ich habe vom Hersteller ein paar .h Datei bekommen und eine VC++ Project Datei mit der der das ganze sich in ein Demoprogramm verwandeln lässt.
Hmm, ich kenn' nur ein bißchen C.
Sind das alle Dateien, oder sind da auch die .c oder .cpp-Dateien (das wäre C++) dabei?
Ist bei Dir ein C/C++-Compiler installiert?

Code: Alles auswählen

NAKA_DLL_API NAKA_API NAKA_Init( short BdNum, int32_t *handle);
Das ist die Deklaration einer Funktion "NAKA_Init()". Die Werte in Klammern sind die Parameter mit dem jeweiligen Datentyp, also ein Integer (short) mit Namen "BdNum" und ein Zeiger auf "int32_t" mit Namen "handle".
Die Dinge vor dem Funktionsnamen sollten eigentlich den Datentyp des Rückgabewerts angeben. Daß da zwei Dinge stehen, "NAKA_DLL_API" und "NAKA_API", verwirrt mich etwas. Vielleicht kann das jemand anders erklären. Du solltest auch mal gucken, wofür die stehen. Wahrscheinlich ist das in der .h-Datei noch irgendwo definiert.
Wenn das z.B. Zeiger auf Strukturen wären, würde das die Sache noch weniger einfach machen ... :(

Soweit erstmal.
Zuletzt geändert von problembär am Freitag 1. Juli 2011, 22:37, insgesamt 1-mal geändert.
deets

@problembaer

Das sind ueblicherweise Makros fuer calling-conventions und sicher auch den rueckgabewert.

So wie's aussieht, hat der OP eine C-DLL + header-Dateien. Er sollte ctypes nehmen.
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Hi,

erstmal danke für die vielen Antworten und sry das ich erst jetzt Antworte.
Also ich habe so weit ich sehe nur 3 solcher .h Dateien und die sind AFAIK nur dafür da die dll anzusprechen.
Die DLL hab ich mittlerweile auch gefunden, auch wenn ich den Programmierer schlagen möchte da die Funktionsnamen nicht der Spec entsprechen (so was wie InitBoard steht in der Spec und die Funktion in der DLL heißt dann Init_board) und kann sie mit Hilfe von ctypes Benutzen. Muss noch etwas umständlich rumhantieren um die Eingabe und Return Werte pythongerecht zu bekommen, aber das schaffe ich schon!
Erstmal Herzlichen Dank für die Hilfe!
Ihr habt mir sehr geholfen!
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

p90 hat geschrieben:Also ich habe so weit ich sehe nur 3 solcher .h Dateien und die sind AFAIK nur dafür da die dll anzusprechen.
So ungefähr. Wie BJ schon sagte enthalten header nur Beschreibungen, bzw. Deklarationen (oft sogar ausschließlich) und das kann Dir helfen: Jetzt weiß ich zwar nicht was Du mit "Specs" meinst (vielleicht eine schriftliche API-Beschreibung, die mit dem Gerät kam oder so?), aber falls die dll wirklich auf Basis dieser header (oder auch nur einer header-Datei) kompiliert wurde, sollte diese Datei(ein) auch die korrekten Funktionsnamen enthalten und Dir die weitere Suche erleichtern.

Im Übrigen hast Du recht: Solche Namensabweichungen können sehr, sehr ärgerlich sein!

HTH
Christian
Antworten