www.mikrocontroller.net

Forum: PC-Programmierung DLL in DevCpp einbinden


Autor: Rupplyn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

bin eigentlich VB-Programmierer und schlag mich grad mit cpp rum. möchte 
ne DLL in ein DevCpp-Projekt hinzufügen.

Hab dazu diverse Codeschnipsel gefunden, z.B.:
extern "C" __declspec(dllimport)void Pruefsumme (char *tmp_string);

Der Linker schmeißt mir ne Meldung raus, dass er die Funktion nicht 
kennt...
in VB muss ich immer den Pfad/Name der DLL mit angeben.

Wie mache ich das in cpp? oder ist der ganze Ansatz mit dllimport 
bullshit?

Gruß Rupplyn

Autor: andreas kasper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo

also hast du beim linker die dll auch angegeben? - hast du vielleicht 
ein passendes header (.h) file für die library?

lg
andi

Autor: Rupplyn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ein header-file habe ich nicht...
wo gebe ich dem linker den die dll datei an?
ich habe den pfad unter compiler-optionen->verzeichnisse->bibliotheken 
hinzugefügt. (explizit die datei habe ich dem linker also nicht 
mitgeteilt...)

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht schreibst du noch genauer was du machen willst. Willst du 
eine eigene DLL machen und in eigenen Programmen benutzen oder willst du 
eine fremde DLL in eigenen Programmen benutzen?

Du kannst DLLs implizit und explizit in Programmen einbinden.

Bei der  impliziten Methode kümmert sich das OS beim Programmstart um 
das Laden der DLL. Dafür muss im Programm stehen, welche DLL benötigt 
wird und wohin die DLL-Aufrufe gehen. Diese Information kann der Linker 
in das Programm einbinden, wenn der Linker seinerseits Infos hat, wie 
die DLL aufgebaut ist. Bei fremden DLLs geben die Programmierer daher 
diese Infos als Headerdateien (Funktionsaufrufe) und sog. 
EXPORTS-Dateien mit.

Bei der expliziten Methode ist die DLL dem OS egal. Du kümmerst dich 
beim Programmlauf um das Laden der DLL (LoadLibrary()) und um die 
Sprungadressen zu den Funktionen (GetProcAddress()). Natürlich musst du 
wissen welche Funktionen es gibt und wie sie aufzurufen sind 
(Parameteranzahl, Typ, Aufrufreihenfolge).

Autor: fieser, klugscheissender Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Stefan:
Warum schreibst du nicht einfach, wie man das (bzw. beide Möglichkeiten) 
beim DEVcpp realisiert?!

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sehe ein Forum als Weg an jemanden auf eine Spur zu schicken oder um 
konkrete Problemen zu lösen.

Letzteres geht bisher nicht, da ich nicht weiss, was konkret gemacht 
werden soll.

Deine Anregung kann ich nicht im Moment aufgreifen, weil nicht soviel 
Zeit investieren will, um das Lehrbuch-/Tutorialmässig so gut zu 
beschreiben, wie es massenhaft im Netz oder in jedem C Buch für 
Windowsprogrammierung zu finden ist.

Autor: Andreas Weschenfelder (Firma: andreas-weschenfelder.de.vu) (rupplyn) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dll's geschrieben habe ich bereits selbst; ist nicht das problem.

ich möchte eine dll von der ich die funktionsdeklarationen kenne in mein 
projekt einbinden.
verwenden könnte ich also die implizite oder explizite variante. welche 
ist den vorteilig?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei der impliziten Methode brauchst du im Programm nicht mit 
Funktionspointern zu arbeiten. Du kannst die DLL-Funktionen wie normale 
Libraryfunktionen oder Programmfunktionen aufrufen. Fehlt eine DLL 
knallt es direkt bei Programmstart, wenn alle Abhängigkeiten aufgelöst 
werden. Und es kann ein Pain in the A** sein, einen fremden Linker zum 
Linken einer Exportsdatei für eine fremde DLL zu überreden 
(Beitrag "Velleman K8055 und Cygwin GCC..."). Wenn ein Update der 
fremden DLL mit geänderter Funktionsreihenfolge rauskommt (eingefügte 
Zusatzfunktionen...), ist es sehr wahrscheinlich, dass du nachziehen 
musst.

Bei der expliziten Methode kannst du zur Laufzeit selbst auf eine 
fehlende Library reagieren z.B. ggf. die Teilfunktionen deines 
Programmes auslassen. Und du kannst eine Teilfunktionalität deines 
Programms per DLL gezielt aus dem Speicher rein- und rausladen z.B. 
einmal die Druckfunktionen reinholen und das andere Mal die 
MP3-Playerfunktionen... Hier ist ein Update einer  fremden DLL weniger 
kritisch, selbst wenn die Funktionsreihenfolge wechselt. Nur die Namen 
und Argumente dürfen sich nicht ändern.

Ich bevorzuge, wenn es geht, die explizite Methode.

Beitrag #4549400 wurde von einem Moderator gelöscht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.