dll import
-
ich hab hier jetzt mal den Code (bzw. Ausschnitte)... Könnte mir bitte jemand weiter helfen... siehe vorherige posts.
--- main.cpp ----
#include <stdlib.h> #include <windows.h> #include <iostream.h> #include <conio.h> #include <stdio.h> #define MAXMODULE 50 void fuckoff (); char module[MAXMODULE]; typedef void (WINAPI*cfunc)(); cfunc hello_world; FOOPOINTER SetFooPointer; void load_plugin () { HINSTANCE hLib = LoadLibrary("lib.dll"); if(hLib == NULL) { //g_print ("Unable to load library!\n"); getch(); //return 0; } GetModuleFileName((HMODULE)hLib, (LPTSTR)module, MAXMODULE); //g_print ("Library loaded: "); hello_world = (cfunc)GetProcAddress((HMODULE)hLib, "hello_world"); SetFooPointer = (cfunc)GetProcAddress((HMODULE)hLib, "SetFooPointer"); if((hello_world == NULL) | (SetFooPointer == NULL)) { //g_print ("Unable to load function"); FreeLibrary((HMODULE)hLib); //return 0; } SetFooPointer (func_in_main); hello_world (); FreeLibrary((HMODULE)hLib); getch(); } int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { [...] load_plugin (); return 0; } void func_in_main () { [...] }
----------------
----lib.cpp----
#include <iostream.h> #include <stdio.h> #include <windows.h> typedef void (WINAPI *FOOPOINTER)(void); FOOPOINTER fuckoff = NULL; extern "C" __declspec(dllexport) void hello_world(); #include "lib.h" void SetFooPointer (FOOPOINTER & f) { func_in_main = f; } extern "C" __declspec(dllexport) void hello_world () { [...] func_in_main (); }
Grüße, Robert.
Edit: Bitte benutze Codetags.
[ Dieser Beitrag wurde am 24.01.2003 um 19:24 Uhr von cd9000 editiert. ]
-
Also aus dem was du gepostet hast werde ich nicht so recht schlau. Anscheinend weißt du selbst nicht so genau was du da eigentlich machst.
void SetFooPointer (FOOPOINTER & f) { func_in_main = f; }
Da weist du der nicht deklarierten Variable func_in_main den Wert von f zu (warum auch immer du da call by reference nimmst).
Du solltest FOOPOINTER auch in der Exe bekannt machen. In der Lib ist das fehl am Platze; da wird kein FOOPOINTER gebraucht, eher cfunc.
SetFooPointer = (cfunc)GetProcAddress((HMODULE)hLib, "SetFooPointer");
Du weißt doch noch welche Signatur SetFooPointer in der lib hat? Genau, es hat einen Parameter, der übrigens cfunc und nicht FOOPOINTER sein sollte.
Warum castest du dann nach cfunc und nicht nach FOOPOINTER?extern "C" __declspec(dllexport) void hello_world () { func_in_main (); }
func_in_main ist der lib nicht bekannt... Benutz den Funktionzeiger!
extern "C" __declspec(dllexport) void hello_world () { fuckoff(); }
Hatte ich schon erwähnt, dass fuckoff vom Typ cfunc sein muss?
Und FOOPOINTER sollte so aussehen:
typedef void (WINAPI * FOOPOINTER)(cfunc);
Ist nicht böse gemeint, aber ich rate dir, dass du erstmal richtig C++ lernst. Besonders (Funktions-)Zeiger solltest du wiederholen, bevor du sowas in DLLs benutzen willst.
btw:
Warum um alles in der Welt bindest du <iostream.h>, <conio.h> und <stdio.h> in ein WinAPI-Programm ein? Das ist nicht wirklich sinnvoll, zumal du keine einzige Funktion daraus benutzt.2nd btw:
Du darfst ruhig bessere Namen wählen. FOOPOINTER und cfunc sind bestimmt nur Beispiele, die man so nicht in richtigen Programmen einsetzen sollte.
-
*lol* Ich dachte, du wolltest eine DLL proggen. Wo ist denn der EntryPoint?
-
hier!!!
-
Du kleiner I-d-i-o-t!
-
Man kann DLLMain auch weglassen.
Kompiliert wirds trotzdem. Ich vermute es läuft sogar (ich hab nur kompilieren getestet). Logischerweise nur solange nicht irgendwelche Sachen initialisiert werden müssen.
-
siehste WebFritzi
:p
-
Bitte lasst diesen Thread nicht in einen Flamewar ausarten, ok?
-
Flamewar? Nö!
-
Servuus,
ich muss jetzt mal ein großes Dankeschön an WebFriti und cd aussprechen.
Eure beiden Beiträge zusammen haben mir viel gebracht. Ich denke ich hab jetzt auch ne Menge dazugelernt:)Viele Grüße,
Robert.