[C++ - LibNoDave] Compilerprobleme bei der Verwendung der DLL

Rusticus

Level-2
Beiträge
30
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

erst einmal möchte ich mich kurz vorstellen.

Gelernt habe ich Elektroniker für Betriebstechnik in einem großen Maschinenbaubetrieb, der Schwerpunkt der Ausbildung lag ganz klar auf Steuerungstechnik der Firma Siemens. Nach meiner Ausbildung habe ich noch den staatlich geprüften Techniker gemacht und in meiner Freizeit versuche ich mich so gut es geht mit Programmierung in Hochsprachen und Informatik im Allgemeinen zu befassen.

Nun zu meinem Problem:

Ich versuche die LibNoDave anzuwenden, Bytes aus einem Datenbaustein auszulesen und ganz einfach zu visualisieren. Allerdings scheitert dies an wohl an vielen Dingen... Meine ersten Versuche die LibNoDave direkt zu kompilieren mit meinem Programm (über die Header-Dateien) führte zu immer verschiedenen Fehlern, wohl auf Grund der Tatsache das ich Code::Blocks mit MinGW verwende und ich wohl somit einen Zwitter besitze ;-)

Mein jetziges bestreben ist es, LibNoDave als DLL zu benutzen, mit Excel hat das bereits wunderbar funktioniert, aber in C++ scheitert es nun an ein paar Sachen. Ich versuche mir aus der nodave.h meine eigene davelib.h zu bauen mit allen Funktionen die ich brauche, allerdings scheitert es nun an einer Stelle:

Code:
typedef struct _daveConnection* (*DaveNewConnectionPtr) (daveInterface*, int, int, int);

So ergibt das keinen Fehler beim compilieren, allerdings verstehe ich nicht, wieso ich das so schreiben sollte, meiner Meinung nach müsste es

Code:
typedef struct _daveConnection* (*DaveNewConnectionPtr) (_daveInterface, int, int, int);

heißen. Zusätzlich kommt dazu, das er zwar fehlerfrei compiliert, allerdings mir dann in der Runtime abstürzt. Dateien sind im Anhang

Hat einer ein paar Tipps für mich?
 

Anhänge

  • main.zip
    4,7 KB · Aufrufe: 34
Benutze nodave.h wie es ist. Wenn du meinst, es verkürzen zu müssen, um es besser zu verstehen, mach das NACHDEM du ein Programm mit der Originalversion zustande gebracht hast. Dann siehst du bei jeder Änderung sofort, ob es noch funktioniert.
Es gibt schon eine vereinfachte Headerdatei, die heißt nodavesimple.h.

Unglaublich, das "führte zu immer verschiedenen Fehlern". Im Allgemeinen liefern Computer und Compiler reproduzierbar dasselbe.

Und dann könntest du halt hinschreiben welche Fehler auftreten.

Aus readme.win: Put the lines
#define BCCWIN
#define DAVE_LITTLE_ENDIAN
before
#include "nodave.h"
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ja das war wohl missverständlich ausgedrückt, natürlich waren es immer die selben Fehler, ich hatte halt verschiedene Sachen ausprobiert und das ergab verschiedene Meldungen. Das Thema hatte ich so weit eigentlich abgehackt, ich war mit der Variante des dynamischen Ladens eigentlich zufrieden.

Sofern ich es austausche und meine "libdave.hpp" gegen die "nodave.h" austausche, so scheitert es doch wieder an der selben Stelle leider. Vielleicht ist es auch ein Verständnisproblem

Das gibt mir meine Anwendung noch aus:
Code:
** Message: Loading DLL...** Message: Loaded DLL - OK
** Message: Load Funktion: openSocket...
** Message: Load Funktion: closeSocket...
** Message: Load Funktion: daveNewInterface...
** Message: Load Funktion: daveNewConnection...
** Message: plc_request
** Message: successfully opened socket to plc
** Message: Establish interface - OK


Process returned -1073741819 (0xC0000005)   execution time : 4.513 s
Press any key to continue.

Code:
#include <stdlib.h>#include <time.h>


//GTK+
#include <gtk/gtk.h>
#include <glib.h>


#define BCCWIN
#define DAVE_LITTLE_ENDIAN


//LibNoDave
#include "SharedLibs.h"
#include "nodave.h"


typedef int (*OpenSocketPtr)(int, char*);
typedef int (*CloseSocketPtr)(int);
typedef struct _daveInterface*  (*DaveNewInterfacePtr)  (_daveOSserialType, char*, int, int, int);
typedef struct _daveConnection* (*DaveNewConnectionPtr) (daveInterface*, int, int, int);


typedef struct daveStruct{


    void *hDLL;
    OpenSocketPtr openSocket;
    CloseSocketPtr closeSocket;
    DaveNewInterfacePtr daveNewInterface;
    DaveNewConnectionPtr daveNewConnection;


} daveStruct;

Also ich weiß das es an meinem Code liegt und auch an der Implementierung von "daveNewConnection", ich hätte es gern über diesen Weg gelöst, wenn das nicht geht oder ich es falsch anpacke, werde ich es nochmal über einen anderen Weg probieren müssen. Primär hätte ich gerne verstanden, was ich falsch mache

Vielen Dank.

Schöne Grüße,
Rusticus
 
Hallo Thomas,

danke für den Link, diesen kenne ich bereits. Ich benutze ja bereits die fertig kompilierte DLL, das Problem liegt in meinen Augen in meiner Deklaration von
Code:
[COLOR=#333333]typedef struct _daveConnection* (*DaveNewConnectionPtr) (daveInterface*, int, int, int);[/COLOR]

Ich versuche nur zu verstehen, was daran falsch und richtig ist.

Wenn ich nun total an euch vorbei rede, dann sagt das bitte, im Moment kommt es mir so vor
 
Ich werde für Grundlagen meine Abschlussarbeit von Libnodave und andere vergleichbare Methoden eine dokumentation vorbereiten. Kannst du mir weiter helfen?
VG
point
 
Zurück
Oben