Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » DLL einbinden bei Consolen Programm

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
06.12.2004, 17:14 Uhr
Dramm



Ich habe mit MSVC++ eine DLL erstellt in der ich eine einfache Funktion erstellt hab. Die DLL sieht etwa so aus:


C++:

// DLLTest.h

#include <iostream>
using namespace std;

extern "C" __declspec(dllexport) void HalloWelt();





C++:

// DLLTest.cpp

#include "DLLTest.h"

extern "C" __declspec(dllexport) void HalloWelt()
{
  cout << "Hallo Welt!" << endl;
}




Kompilieren geht ja noch aber was muss ich jetzt genau machen um in meinem Konsolenprogramm die Funktion HalloWelt() verwenden zu können?
--
Cu Dramm
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.12.2004, 18:56 Uhr
Spacelord
Hoffnungsloser Fall


Hi,
vom Prinzip her müsstest du den Header auch in dein Projekt einfügen,dafür müsstest du ihn aber etwas anders aufbauen.
Dann musst du noch die erzeugte .lib dem Projekt hinzufügen und dafür sorgen dass die Dll an einem Ort ist wo sie gefunden wird(aber am besten nicht im System32 Ordner sondern in dem Verzeichnis deiner .exe).

Damit du den Header auch gebrauchen kannst um die Funktionsprototypen in deinem Projekt bekannt zu machen solltest du ihn etwa so umbauen:

C++:
#ifdef __EXPORT_HELLO_API
#define __DLL_API extern"C" _declspec(dllexport)
#else
#define __DLL_API extern"C" _declspec(dllimport)
#endif

__DLL_API void HalloWelt();




und in der entsprechenden .cpp Datei defininierst du dann __EXPORT_HELLO_API damit
das Makro __DLL_API zum exportieren erweitert wird.Wird __EXPORT_HELLO_API nicht definiert wird __DLL_API zum importieren erweitert.
Also musst du __EXPORT_HELLO_API nur in der .cpp der Dll definieren und kannst den Header zum Importieren in jedes Projekt normal includen.




C++:
#define __EXPORT_HELLO_API

#include "HelloWorld.h"
#include <iostream>

__DLL_API void HalloWelt()
{
    std::cout << "Hallo Welt!" << std::endl;
}





Naja und im Hauptprogramm:

C++:
#include <iostream>
#include "HelloWorld.h"

int main()
{
    HalloWelt();

    return 0;
}




Es gibt noch andere Möglichkeiten die Dll Funktion(en) explizit zur Laufzeit zur laden,anstatt diese wie hier zur Compilezeit zu binden. Das hier sollte aber erstmal reichen.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.

Dieser Post wurde am 06.12.2004 um 18:57 Uhr von Spacelord editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.12.2004, 19:48 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


meist wird vom Compiler _DLL oder sowas bei einer DLL definiert, damit kann man die unterscheidung dann auch machen
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.12.2004, 17:33 Uhr
Dramm



Immer wenn ich versuche das Hauptprogramm zu kompilieren bringt der Linker nen Error, das er das Headerfile nicht gefunden hat. Hab die lib und dll ins Projektverzeichnis kopiert und die lib unter Projekt -> Einstellungen -> Linker eigebunden.
--
Cu Dramm
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.12.2004, 17:36 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


die headerdatei in denen die export-prototypen stehen musst du natürlich in dein projekt einbinden und dort muss er sie auch finden (entweder vollständigen pfad zum header angeben oder den header ebenfalls ins exe-projekt kopieren)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.12.2004, 23:04 Uhr
DieRuhevordemSturm



link doch dynamisch

mach einfach:


C++:
HINSTANCE abc = LoadLibrary("user32.dll");
long *p  = GetProcAdress(abc,"MessageBoxW");





so das bringt dir z.B. die Adresse der MessageBox Func im Unicode Format. Der Rückgabetyp von GetProcAdress stimmt glaub ni -> musst mal selber googlen nach : "MSDN GetProcAdress"

Mfg Ich
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.12.2004, 09:45 Uhr
Spacelord
Hoffnungsloser Fall


Mal abgesehen davon dass du als Rückgabewert nen Funktionspointer brauchst und den Rückgabewert von GetProcAdress nicht einfach in nem long pointer speichern kannst,
braucht man auch nen trifftigen Grund wenn man sich den Kram mit dem explizitem Binden antun will.
Wenn er doch den Header und die Lib hat sehe ich da auf die schnelle keinen wirklichen Grund für....

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: