Dll statisch einbinden

Moderatoren: crack, Krüsty, Marwin

Dll statisch einbinden

Beitragvon Rainer » Freitag 19. März 2010, 10:40

Hallo,
ich habe gerade meine ersten Gehversuche in C++ gemacht und bin gleich mal auf die Nase gefallen. Ich arbeite mit Devcpp. Ich möchte eine DLL statisch einbinden und bekomme das einfach nicht hin. Ich habe eine Dll (TestDll.dll), die mit MASM32 erstellt und auch getestet wurde, eine Lib (TestDll.lib), in der Dll ist nur eine Funktion:
Code: Alles auswählen
addiere proc a:dword, b:dword
   mov eax, a
   add eax, b
   ret
addiere endp


Habe schon viele Stunden gegooglet und das ist dabei rausgekommen:

Code: Alles auswählen
_____________in der main.cpp________
#include "TestDll.h"
#pragma comment(linker, "TestDll.lib");

/* Fenster erstellen usw.

 in der WndProc dann bei WM_CREATE: */

int y;
y = addiere(2, 3);


____________ in der TestDll.h_________
__declspec(dllimport) extern "C" int addiere(int,int);



Im Projekt-Verzeichnis sind alle Dateien vorhanden, auch die TestDll.lib. Wenn ich das jetzt compiliere, kommt folgender Fehler-Report:
    F:\Dev-Cpp\Projects\Projekt 5\main.cpp In function `LRESULT WndProc(HWND__*, UINT, WPARAM, LPARAM)':
    102 F:\Dev-Cpp\Projects\Projekt 5\main.cpp `addiere' undeclared (first use this function)
    (Each undeclared identifier is reported only once for each function it appears in.)
    F:\Dev-Cpp\Projects\Projekt 5\Makefile.win [Build Error] [main.o] Error 1

Wenn ich den Funktionsaufruf
y = addiere (2, 3);
rausnehme, kommt kein Fehler. Auch im Petzold habe ich nichts gefunden, das mir weitergeholfen hätte. Es wäre schön, wenn mir da jemand weiterhelfen könnte.

Gruß Rainer
Zuletzt geändert von Rainer am Freitag 19. März 2010, 15:12, insgesamt 1-mal geändert.
Rainer
Alter Hase
 
Beiträge: 78
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg

Re: Dll statisch einbinden

Beitragvon crack » Freitag 19. März 2010, 14:41

Ich bin kein C++ Spezialist, aber so auf den ersten Blick würde ich sagen das eine Datentypdeklaration fehlt, für Assembler sind die Variablen DWORDS, aber C++ muss ja wissen ob es Short INT oder Long INT oder was auch immer ist.
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf

Re: Dll statisch einbinden

Beitragvon Rainer » Freitag 19. März 2010, 15:21

ich denke mal, in der TestDll.h die Zeile

__declspec(dllimport) extern "C" int addiere(int,int);

sollte doch den Rückgabewert und auch die Parameter als int declarieren. Zwischenzeitlich habe ich festgestellt, dass, wenn ich dreimal int für die Parameter angebe, kommt kein Fehler, solange die Funktion nicht aufgerufen wird. Ich denke mal, dass die Einbindung der Funktion oder sogar der Lib-Daten fehlerhaft ist, sonst müsste doch schon beim Linken ein Fehler angezeigt werden?
Rainer
Alter Hase
 
Beiträge: 78
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg

Re: Dll statisch einbinden

Beitragvon crack » Freitag 19. März 2010, 19:38

musste man bei C++ nicht immer den Dummy Parameter 'void' mitangeben, damit der ProzessID auch eine Variable reserviert wird?
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf

Re: Dll statisch einbinden

Beitragvon Rainer » Freitag 19. März 2010, 21:10

void bedeutet doch 'nichts' oder 'leer'; ich denke mal, das wird verwendet, wenn kein Rückgabewert erwartet wird. In diesem Fall habe ich 'int' gesetzt.
Rainer
Alter Hase
 
Beiträge: 78
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg

Re: Dll statisch einbinden

Beitragvon crack » Freitag 19. März 2010, 21:21

axo, dann müsstest Du doch die Prozedur mit 'ret n' beenden, damit 'n' Bytes auf dem Stapel bleiben, oder?
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf

Re: Dll statisch einbinden

Beitragvon Rainer » Freitag 19. März 2010, 21:25

bei Assembler wird eax (32 Bit Register) immer zurückgeliefert, andere optional. Ich nehme mal an, deshalb auch das void wenn nichts zurückerwartet wird, denn wo sollte der Inhalt von eax sonst landen?
Rainer
Alter Hase
 
Beiträge: 78
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg

Re: Dll statisch einbinden

Beitragvon crack » Freitag 19. März 2010, 21:31

ah, ok,
btw. muss man nicht aus der DLL eine Lib erzeugen um die symbolischen Sprungaddressen des Aufrufers in die relativen Sprungaddressen innerhalb der DLL umzusetzen?
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf

Re: Dll statisch einbinden

Beitragvon Rainer » Freitag 19. März 2010, 21:36

genau, die ist ja auch mit im Verzeichnis und wird natürlich gebraucht. Ich bin immer noch am probieren, aber weiter gekommen bin ich auch noch nicht.
Rainer
Alter Hase
 
Beiträge: 78
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg

Re: Dll statisch einbinden

Beitragvon Rainer » Samstag 27. März 2010, 16:23

Hallo,

jetzt habe ich den Fehler gefunden. Nachdem ich ca. 25 Stunden im Internet nach der Lösung gesucht und vieles ausprobiert habe, ist mir die geniale Idee gekommen, doch mal in der Hilfe von dev c++ nachzuschlagen und siehe da - da stand die Lösung. Ganz einfach: in den Projekt Optionen 'Parameter' wählen und die *.lib auswählen.

In der *.h muss dann noch

#define IMPORT extern "C" __declspec (dllimport)
IMPORT int _stdcall multi (int, int);
IMPORT int _stdcall addiere (int, int);

rein, und das Ganze funktioniert. Das #pragma in der main.cpp kann entfallen. Ich habe in der Dll (in Assembler) noch die Funktion 'multi' dazugeschrieben, die multipliziert a mit b. Probehalber habe ich in C++ auch gleich noch eine TestDll produziert, da heißt die *.lib nur

libTestDll.a,

sonst funktoniert alles genau so.


Gruß Rainer
Rainer
Alter Hase
 
Beiträge: 78
Registriert: Freitag 21. Juli 2006, 14:39
Wohnort: Senftenberg

Re: Dll statisch einbinden

Beitragvon crack » Samstag 27. März 2010, 21:09

Super 8)
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf


Zurück zu C/C++

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron