Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Chase

Alter Hase

  • »Chase« ist der Autor dieses Themas

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

1

25.06.2006, 19:46

DLLs zur Load-time einbinden

Tag zusammen. Ich benutze VS Express 2005 (thx^^) und braeuchte mal Hilfe mit DLLs. Das FAQ hab ich zwar gelesen, so richtig komm ich aber noch nicht klar. Seltsamerweise hab ich keine Probleme DLLs zur Laufzeit einzubinden.. soll die DLL einfach als .lib eingebunden werden erhalte ich aber Compilerfehler.
Erst mal mein stark vereinfachter DLL-Code

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <windows.h>
extern "C" {  
    //Ich glaube die DllMain wird garnet benoetigt..

    BOOL WINAPI DllMain(
    HINSTANCE hinstDLL ,DWORD fdwReason,LPVOID lpReserved )
   {
     return TRUE; 
   }

   //Eine Funktion die sowohl zur Laufzeit

   //als auch zur Ladezeit eingebunden werden soll

   __declspec(dllexport) int number()
  {
    return 14;
   }
  
}

Wenn ich jetzt zur Runtime laden will mach ich das wie folgt:

C-/C++-Quelltext

1
2
3
4
5
6
HINSTANCE dyn;
int (__stdcall* dynfunc)(VOID);
// ...

dyn = LoadLibrary("Dynamic.dll");
dynfunc = GetProcAddress(dyn,"number");
int result = dynfunc();

So weit so gut. Jetzt soll die DLL aber bei Programmstart geladen werden. Also die Library "Dynamic.lib" in das Projektverzeichnis kopieren und bei
Preferences mitverlinken.
Theoretisch sollte ich die Funktion jetzt einfach nur definieren muessen und dann sollte sie aus meiner DLL geladen werden:

C-/C++-Quelltext

1
2
3
int number(VOID);
//...

int result = number();

Leider erhalte ich immer einen Compilerfehler:
error LNK2019: unresolved external symbol __imp__number@0
Hab ich da grundsetzlich was falsch verstanden oder nur irgendwas vergessen? Danke fuer jede Hilfe
"Have you tried turning it off and on again?"

Anonymous

unregistriert

2

25.06.2006, 20:03

Korrektur: Es gibt kein Express 2006 und man nennt das nicht "Load-Time" sondern "Runtime"

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

3

25.06.2006, 20:34

Zitat


int number(VOID);
//...
int result = numer();

Das is zwar wahrscheinlich noch nicht der Fehler um den es geht, aber dürfte auch probleme machen

Chase

Alter Hase

  • »Chase« ist der Autor dieses Themas

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

4

25.06.2006, 20:36

Zitat von »"nix da"«

man nennt das nicht "Load-Time" sondern "Runtime"

Naja, laut diesem MSDN Artikel ist Load- und Runtime etwas vollkommen Unterschiedliches. Ist vielleicht etwas unklar formuliert: Runtime klappt, Loadtime nicht

grek40
Nene, ein einfacher Tippfehler ist es nicht (hab den Code eben vereinfacht) - es muss irgendwie mit den Linker- oder Compilereinstellungen zu tun haben.
"Have you tried turning it off and on again?"

Anonymous

unregistriert

5

25.06.2006, 20:43

Chase
Ich weiß, aber was Du machst ist Run-Time Dynamic Linking und nicht Load-Time Dynamic Linking.

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

6

25.06.2006, 20:48

Vermutlich fehlt irgendwo ein __declspec (dllimport) würde ich mal sagen.

Wenn du das direkt aus der DLL ausliest, ist das nicht so wichtig, aber der Linker muss das schon wissen.
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Chase

Alter Hase

  • »Chase« ist der Autor dieses Themas

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

7

25.06.2006, 20:57

Wie saehe denn der (Load-time) Code aus der die Methode number() aufruft?
Die .lib ist im Linker angegeben, ich bin mir aber nicht sicher ob damit schon alles getan ist.
__declspec(dllimport)int number();
liefert den gleichen Fehler.
"Have you tried turning it off and on again?"

Anonymous

unregistriert

8

25.06.2006, 21:25

Chase
Load-Time Dynamic Linking:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/using_load_time_dynamic_linking.asp
Run-Time Dynamic Linking:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/using_run_time_dynamic_linking.asp

Chase

Alter Hase

  • »Chase« ist der Autor dieses Themas

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

9

25.06.2006, 21:41

Die MSND Artikel hab ich alle gelesen. Selbst wenn ich den Code 1:1 uebernehme laesst er sich bei mir nicht kompilieren. Die Fehlermeldung ist die Selbe:

Quellcode

1
DLLTester.obj : error LNK2019: unresolved external symbol "int __cdecl myPuts(wchar_t *)" (?myPuts@@YAHPA_W@Z) referenced in function "int __cdecl _tmain(int,char * * const)" (?_tmain@@YAHHQAPAD@Z)
"Have you tried turning it off and on again?"

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

10

25.06.2006, 22:04

Ich hab das mal selbst ausprobiert...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* Implementation in der DLL */
extern "C"
{
    __declspec (dllexport) int my_number ()
    {
        return 42;
    }
}

/* Prototyp für main */
extern "C"
{
    __declspec (dllimport) int my_number ();
}


Das funktioniert ganz wie erwartet. Natürlich wird my_number auch benutzt... ;)
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Werbeanzeige