Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Win32 dll in vc++.net2003 erstellen?

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 < [ 2 ]
000
12.02.2006, 20:34 Uhr
xenayoo



Hallo Forum, ich brauche - mal wieder - eure Hilfe.

In einem Private-Coaching habe ich gelernt, wie man für bestimmte Aufgaben diverse Rechenoperationen in dlls auslagert und diese aufruft. Dies wurde mit einer Autorenedition von Vc++ 6 erledigt. Knackpunkt der Autorenedition ist ein jedesmal aufploppendes Fenster, dass einen auf die Autorenversion hinweist. Dies blockiert jedoch teilweise die Anwendung, die diese dlls aufruft. Da mehrere verschiedene dlls aufgerufen werden, erscheint dieses Fenster auch mehrfach. Hat man eins übersehen, ist die Anwendung blockiert, bis man es gefunden und bestätigt hat.
Aus diesem Grunde habe ich mir nun VC++.net2003 zugelegt. Als Ordnung liebender Mensch habe ich eine Projektmappe angelegt (was trotz eines 2.4GHz Celeron mit 750MB fast 2 Minuten dauert - wie lange muß denn da jemand warten, der den Mindestanforderungen entsprechend einen 400MHz P2 mit 32MB einsetzt?), und die einzelnen dlls als Projekte in dieser Projektmappe. Dabei sind folgende Fragen und Probleme aufgetaucht, die ich bis jetzt nicht klären konnte:

1. Das erste Projekt wird fett dargestellt. Warum und was bedeutet dies?
2. Ich habe die Header, Resourcenfiles und Quellcodes 1 zu 1 in Vc++2003 übernommen. Dabei trat dann das Problem auf, dass die jeweils letzte Funktion in der DLL trotz korrekter Deklaration im Quellcode als auch im def-File nicht erreichbar ist. Woran kann das liegen?
--
Wer Rechtschreibfehler findet, darf sie behalten.... ;)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.02.2006, 11:24 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


also, 2.4ghz sollte einwandfrei gehen, hab hier nur nen 2ghz (ok athlon, aber trotzdem) und es geht einwandfrei, evtl hilft festplatte zu defragmentieren.

zu 1. das ist das "Startprojekt", d.h wenn du F5 drückst, startet er dieses Projekt zum debuggen. Kann man mit Rechtsklick auf das entsprechende Projekt setzen.

zu 2. das ist seltsam, sowas dürfte nicht passieren, hast du korrekt extern "C" und __declspec(dllexport) benutzt, bzw export-file korrekt? C-Bindung korrekt (mit .c-files?) Evtl mal die Dll-Enden zeigen (Inhalt der Funktionen kannste theoretisch rauslassen, darum gehts ja nich) Evtl generiert der neuere VC andere C++-Funktionsnamen-Extensions als der alte, d.h du musst deine export-files anpassen. (oder eben extern "C" benutzen)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.02.2006, 11:49 Uhr
~xenayoo
Gast


Danke für die schnelle Antwort. Ich werde mir die dlls mal mit einem Utillity ansehen, welches die Externen Funktionsnamen sichtbar macht.

Ich muß dazu sagen, dass der Programmierstil etwas holprig ist und wohl eher unter "C" läuft. Zunächst möchte ich die dlls so zum laufen bringen. Wenn sie funktionieren möchte ich sie modernisieren und optimieren...

so sind die Funktionen in dem cpp-file:


C++:
int __stdcal FunktionsName(int Parameter...)


und im Def-File:


C++:
EXPORTS
       FunktionsName




angegeben. Unter vc++6(autorenedition) lief das Ganze mit Ausnahme der nervigen Hinweisfenser fehlerfrei. Nun bei Vc++.net2003 ist die jeweils letze Funktion im def-File von der aufrufenden Anwendung aus nicht erreichbar. Da ich bislang keine brauchbare Dokumentation zu win32-dlls gefunden habe, kannte ich __declspec ... noch nicht. Die von mir verwendete Variante ist von dem "Lehrer" quasi zusammengeschustert worden. Ich habe den Eindruck, dass er selbst nicht so recht weiß, was er da gemacht hat - Hauptsache es läuft. Mir reicht das aber nicht... Wie sähe denn eine Beispiel-dll aus, wenn man __declspec verwendet und wo liegt der Unterschied?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.02.2006, 13:03 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


__stdcall und __declspec sagen aus in welcher Reihenfolge die Paramter an die Funktion übergeben wurde und wer nachher für das Aufräumen verantwortlich ist. Es ist also die Konvention nach der gearbeitet wird. Deshalb sollte das in der DLL und dem aufrufendem Programm gleich sein.

Wenn du Funktionen auf diese Weise exportierst dann kannst du sie später statisch in dein Programm einbinden. D.h du hast dir eine entsprechende Header Dateierstellst in der du dem Compiler die Funktionen bekannt machst und sagst das sie aus ner DLL kommen. Außerdem musst du dann dem Linker noch die entsprechnde .Lib Datei zu dieser DLL angeben. Der Rest geschieht dann automatisch.

Die Exporte in der Def Datei sind dazu da um die DLL dynamisch zu laden. D.h. du rufst dann in deinem Programm irgendwo LoadLibrary auf und danach dann GetProcAdress um einen entsprechenden Funktionszeiger auf die Funktion in der DLL zu verweisen.

Du kannst in einer DLL entweder nur eine dieser beiden Möglichkeiten verwenden oder auch beide. Das kommt halt drauf an wie du die DLL später verwenden willst.


Um dir zu sagen was du falsch gemacht hast und warum die letzte Funktion nicht gefunden wird musst du uns genau zeigne wie du sie exportierst und im Programm importierst.

Dieser Post wurde am 13.02.2006 um 13:05 Uhr von Guybrush Threepwood editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.02.2006, 13:26 Uhr
xenayoo



Also zunächst wird die dll nicht aus einem weiteren c-Programm aufgerufen (das ist für später geplant ). Die Funktionen werden - wie oben beschrieben - über ein separates DEF-File exportiert. Im Quellcode werden die Funktionen dann via __stdcall definiert.

Das Programm, dass die dll aufruft, ist vergleichbar mit Excel. Dort wird über eine Interpretersparache erst die DLL definiert und später die Funktion aufgerufen.


Code:
defineuserdll: "Pfad_und_name_der_dll", Rückgabetyp, "FunktionsName", Parameter...;


Dieser Aufruf sorgt seit vc++2003 mit der letzten Funktion des DEF-Files für Probleme:

Zitat:
cannot find function in user-dll....


Die Schreibweisen habe ich hin und her, rauf und runter überprüft. Es handelt sich immer um die jeweils letzte Funktion des DEF-Files. Es ist auch immer die lezte Funktion, die aufgerufen wird. Alle vorigen Funktionen sind verfügbar. Muß in c++2003 ggf irgendwie das Ende der Funktionsnamenliste gekennzeichnet werden?
--
Wer Rechtschreibfehler findet, darf sie behalten.... ;)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.02.2006, 13:42 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


probier mal das explizite exportieren mit vc-makros:


C++:
int __stdcall __declspec(dllexport) FunktionsName(int Parameter...)


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
13.02.2006, 13:54 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)



Zitat von xenayoo:
Also zunächst wird die dll nicht aus einem weiteren c-Programm aufgerufen (das ist für später geplant ). Die Funktionen werden - wie oben beschrieben - über ein separates DEF-File exportiert. Im Quellcode werden die Funktionen dann via __stdcall definiert.


Die beiden Sachen haben nichts miteinander zu tun. Wenn du die Funktionen in deinem Programm per __stdcall bekannt machst dann muss in deiner DLL auch irgendwo eine Stelle sein wo sie so exportiert werden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
13.02.2006, 14:01 Uhr
xenayoo




Zitat von Guybrush Threepwood:
Die beiden Sachen haben nichts miteinander zu tun. Wenn du die Funktionen in deinem Programm per __stdcall bekannt machst dann muss in deiner DLL auch irgendwo eine Stelle sein wo sie so exportiert werden.
Ich habe leider keine Ahnung was genau du meinst. Ich suche mich seit Tagen dumm und dämlich nach Informationen über das Programmieren von dlls (unter anderem auch im MSDN). Meinst du eventuell den Teil, den ich weiter oben schon beschrieben habe: Dass ich ein separates DEF-File mit EXPORTS verwende?
--
Wer Rechtschreibfehler findet, darf sie behalten.... ;)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
13.02.2006, 14:22 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Ja.
Hast du dir meinen ersten Post überhaupt durchgelesen wo ich die unterschiede erklärt habe?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
13.02.2006, 14:32 Uhr
xenayoo




Zitat von Guybrush Threepwood:
Ja.
Hast du dir meinen ersten Post überhaupt durchgelesen wo ich die unterschiede erklärt habe?

Ja, nur verstehen tu ich ihn nicht. Die Seite mit __declspec ist im MSDN nichterreichbar. Somit weiß ich, dass __stdcall und __declspec zwar irgentwie vergleichbar sind, aber dennoch unterschiedlich sind. Bei __stdcall wird ein Def-File verwendet, um die Externen Funktionen nach außen bekannt zu machen, bei __declspec nicht. Dass ist aber auch schon so ziemlich alles, was ich sagen kann.
Falls es dann auch noch irgendetwas mit der Reihenfolge zu beachten ist... *achselzuck*
--
Wer Rechtschreibfehler findet, darf sie behalten.... ;)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


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: