DLL Regeln... was geht / was geht nicht
-
Hi all,
Ich habe gerade angst dass ich gleich die Lust an meinem Projekt verliere weil ich auf die Idee kam bei 80% einfach mal auf DLLs umzustellen und jetzt geht nichts mehr...Also ich habe den Fehler (AccessViolation) eingezäunt auf:
printf( "." ); myWnd = CreateWindow( appName, //Name der Fensterklasse appTitle, //Titel des Fensters WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX,//Stil des Fensters CW_USEDEFAULT, //Position X CW_USEDEFAULT, //Position Y progWidth, //Breite progHeight, //hoehe NULL, //Parent myMenu, //Menue myHandleInst, //Handle des Programms NULL //Zusaetzliche Daten ); printf( "." );Die ausgabe ist
. //WINDOWSNachricht von ewgen "Musste beendet werden"Wenni ch "Programm Debuggen" klicke steht halt "AccessViolation".
Jetzt habei ch mich gefragt, da halt schon das mit LRESULT CALLBACK nicht ging, ob es da regeln gibt, was in eine DLL darf und was nicht, oder ob ich eifnach was falsch mache... !?
[edit]DANKE für jede antwort... Ich habe gesucht aber irgendwie komm ich nich aufn grünen Ast...
Hier im Forum steht auch nicht allzuviel zu DLLs immer nur Probleme, aber nicht Regeln xD
-
Wo rufst Du den gezeigten Code auf?
DllMain?
Simon
-
Ich habe keine DllMain implementiert da es auch ohne lief... ist das mein Fehler?
Dieser Code steht in einer DLL funktioniert aber nicht. Es ist quasi eine Funktion die diese Funktion aufruft und halt paar sachen zusätzlich nochmacht... Nichts besonderes also.
Danke für deine Antwort.
[edit]Globale Variablen.. liegts daran? Dürfen die in DLLs verwendet werden? ja ich weiß sehr sauber ist es nicht aber ich mein geht es überhaupt?
-
Das liegt nicht an DLL sondern an der Funktion.
habe sie in die prog.c mit aufgenommen um zu Testen obs da geht, witzig ist: auch hier schmiert CreateWindow ab.Wieos? Ich habe nichts gändert... ? Fällt wem was an der Funktion auf? hier die params
#define VERSION "0.20.05-350" #define appName "iBassTabs" #define newTABHeight 300 #define newTABWidth 400 char appTitle[256] = { 0 }; HMENU myMenu = NULL; HINSTANCE myHandleInst; wsprintf( appTitle, "%s - Write your own Bass Tabs | Version: %s\0", appName, VERSION );Danke fürs lesen...
-
Hallo,
hier fehlt mir die Angabe, welche Art Fenster (WS_OVERLAPPED, WS_POPUP usw..) es sein soll, ausserdem ist unklar, wie und ob RegisterClass aufgerufen wurde...
MfG,
Probe-Nutzer
-
Erstmal danke für deine Antwort!!!!!
Ok, ich war im Urlaub bin aber wieder da:
also RegisterClass wird so aufgerufen wie in einem normalen Programm auch, liegt halt in einer DLL.Danach kommt
BOOL createMainWindow( HINSTANCE myHandleInst ) /* This function creates the Window of the program. It sends also a WM_CREATE message to the window procedure. */ { HWND myWnd; BOOL returnValue = TRUE; printf( ".as" ); myWnd = CreateWindow( appName, //Name der Fensterklasse appTitle, //Titel des Fensters WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX,//Stil des Fensters CW_USEDEFAULT, //Position X CW_USEDEFAULT, //Position Y progWidth, //Breite progHeight, //hoehe NULL, //Parent myMenu, //Menue myHandleInst, //Handle des Programms NULL //Zusaetzliche Daten ); printf( ".df" ); if( !myWnd ) //Can't create Window returnValue = FALSE; else { myAppWnd = myWnd; //save the Handle ShowWindow( myWnd, SW_SHOW ); UpdateWindow( myWnd ); //WM_PAINT message an Fenster senden } return returnValue; }Also alles wie vorher, wo noch alles lief.. nur jetz will nichts in die DLL... ?
Wenn du nochwas brauchst, sag bitte bescheid, ist besser als nichts sagen .
-
...bin auch erst gerade aus dem Urlaub zurück...

Du hattest geschrieben, dass es selbst ohne den DLL-Einsatz nicht funktioniert, geht das denn jetzt? Wenn ja, dann kann man sich bei der Fehlersuche auf die DLL konzentrieren...
MfG,
Probe-Nutzer
-
Bist du sicher dass du das korrekte instance-handle an RegisterClass und CreateWindow übergibst?
(CreateWindow ignoriert das AFAIK, aber RegisterClass NICHT)An RegisterClass musst du das instance-handle des Moduls übergeben welches die Window-Procedure enthält, also in deinem Fall vermutlich das Handle der DLL.
Dieses kannst du entweder über hässliche Tricks aus der Adresse einer Funktion in der DLL ermitteln, oder du implementierst einfach DllMain und kopierst dir dort das instance-handle in irgendeine globale Variable.
-
-
lippoliv schrieb:
Also alles wie vorher, wo noch alles lief.. nur jetz will nichts in die DLL... ?
Den ersten Satz verstehe ich! Den zweiten nichtmehr.
Was ich meinte ist:
Ich habe in den DLLs alles wie als es noch in dem Code stand, da lief alles, aber aus den DLLs heraus kommt nichts.
Er kann die funktion halt nicht starten, bei der das Fenster Registriert wird.
Kurzfassung:
create funktion1
check funktion1
funktion1 == OKmove funktion1 bla.c -> bla.dll
check funktion1
funktion1 != OKTja so siehts aus...
Ok Martins post...
Auch wenn ich... hm...
Ich habe eine DLL aus der die FensterKlasse registriert wird, an die übergebe ich eine eigene Struktur die unter anderem auch eine HINSTANCE Variable(die hInstance entspricht) beinhaltet.
Dann sollte das auch gehen oder?DANKE FÜR EURE POSTS!
[edit]
Also ich habe die resource.h mit HINSTANCE aktInst;
Die resource.h wird in der prog.c und der erstellten bla.dll benutz.jetzt sage ich in der prog.c bei winMain aktInst = hInstance;
und in der bla.dll wird aktInst zum registrieren der Fensterklasse benutzt.Ist aktInst aus der dll das selbe wie das aus prog.c? Nein ne?
das ist mein Fehler ne?
[edit2]
gut das ist der fhelr.
Bei dem getrennten kompilieren entstehen auch getrennte variablen,
das heist die aktInst aus der resource.h die in die dll compiliert wird, ist später natürlich nicht mehr die selbe wie die von der exe...Habe jetzt erstmal zu tun, um alles umzuschreiben... danke für eure anregungen..
-
Martin Richter schrieb:
Ich hab den Artikel übrigens gelesen (also früher schon, nicht erst jetzt wo du den Link gepostet hast).
Nett
-
hustbaer schrieb:
Martin Richter schrieb:
Ich hab den Artikel übrigens gelesen (also früher schon, nicht erst jetzt wo du den Link gepostet hast).
Nett
Beide Beiträge sind nett.
Ich hab ihn auch gelesen, der brachte micha uf die idee das DLL glob-Vars != EXE glob-Vars sind, auch wenn sie in der selben .h standen