d.uNd.eE Geschrieben 16. Januar 2008 Teilen Geschrieben 16. Januar 2008 Hi zusammen... ich hab mal wieder n problem mit meinen heißgeliebten DLL's :cool: Alsooo...hab n kleines Programm, was ne von mir geschriebene DLL ansteuert. Es muss auf mehrere Funktionen dieser DLL zugreifen, deshalb: Inhalt von definitions.h typedef int (*testfunc)(int, int); typedef bool (*init)(char*,char*,char*,char*,char*); HINSTANCE hinstLib; [/PHP] Der Zugriff auf "testfunc" geht wunderbar [PHP] function = (testfunc) GetProcAddress(hinstLib, "checksum"); result = (*function) (a,; Wenn ich danach aber "init" ausführen will muss ich vorher die DLL unloaden und das handle wieder neu zuweisen. ich finde das ist performacetechnisch kritisch und Stiltechnisch ne Katastrophe. Deshalb: a) Wieso ist das so? Wie kann ich das verhindern? Statisch linken funktioniert nicht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 16. Januar 2008 Teilen Geschrieben 16. Januar 2008 a) Wieso ist das so? Wie kann ich das verhindern? a) weil du irgendwo einen Fehler hast indem du den Fehler korrigierst sry, aber mit den Informationen kann man dir nicht mehr sagen außer das das Problem an deinem Programm/Dll liegt Zeig mal den entsprechenden Code... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 16. Januar 2008 Teilen Geschrieben 16. Januar 2008 Wenn ich danach aber "init" ausführen will muss ich vorher die DLL unloaden und das handle wieder neu zuweisen.Was heißt denn "du musst"? Was passiert denn, wenn du es nicht tust? Und antworte bitte nicht mit "dann funktioniert es nicht" , denn... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
d.uNd.eE Geschrieben 16. Januar 2008 Autor Teilen Geschrieben 16. Januar 2008 Ich dachte, ich hätte es umgehen können, die code zu posten, der stil ist grausig, die eintückung schlecht...und eh alles mist. War egtl nur n Testprogramm, ob ich auf die DLL's komme und hat jetzt noch n grösseren Nutzen bekommen, daher. Aus dem grund auch null kommentiert, ausser halt das, was ich aus alten snippets mit copypasted hab^^ definitions.h typedef int (*testfunc)(int, int); typedef bool (*init)(char*,char*,char*,char*,char*); HINSTANCE hinstLib; [/PHP] main.cpp [PHP] #include <windows.h> #include <stdio.h> #include <cstdlib> #include <iostream> #include "definitions.h" using namespace std; void setColor(short int a) { HANDLE handle = GetStdHandle( STD_OUTPUT_HANDLE ); SetConsoleTextAttribute( handle, a ); } void printColorTable(int from = 0, int to = 255) { system("CLS"); for(int i=from;i<=to;i++) { setColor(i); cout<<"Style no. "<<i<<endl; }; setColor(15); system("Pause"); }; int initDLL () { testfunc function; int result; // DLL Datei laden hinstLib = LoadLibrary("Interactions.dll"); if(hinstLib==NULL) { printf("DLL nicht gefunden\n"); getchar(); return 0; }; if (hinstLib) { // Die Einsprungadresse abfragen function = (testfunc) GetProcAddress(hinstLib, "checksum"); // Die Funktion aufrufen if (function) { int a = 5; int b = 9; result = (*function) (a,; if(result== a * b + b - a) { setColor(10); printf("DLL (Interactions.dll) geladen\nChecksumtest erfolgreich bestanden"); setColor(15); } else { printf("DLL hat Checksumtest nicht bestanden\n Vorgang wird abgebrochen\n"); return 0; }; } else { printf("Funktion konnte nicht aufgerufen werden\n"); return 0; }; // Die DLL-Datei wieder entladen FreeLibrary(hinstLib); } else { printf("Einsprungsadresse nicht gefunden\n"); return 0; }; // Das Ergebnis anzeigen if (!hinstLib || !function) printf("Fehler: Konnte die Funktion nicht aufrufen\n"); FreeLibrary(hinstLib);//DLL entladen return 1; } bool initITEP_COMP(char* testfile,char* scenarioparams, char* paramspath, char* logfile, char* settings) { hinstLib = LoadLibrary("Interactions.dll");//DLL wieder laden if(hinstLib==NULL) { setColor(12); cout<<"DLL nicht geladen"<<endl; setColor(15); getchar(); return 0; }; bool result; init ITEP; ITEP = (init) GetProcAddress(hinstLib, "init"); setColor(14); cout<<"pruefe init"<<endl; if(!ITEP) { setColor(12); cout<<"init nicht gefunden"<<endl; setColor(15); return 0; } else { setColor(10); cout<<"init OK"<<endl; setColor(15); }; (*ITEP) (testfile, scenarioparams, paramspath, logfile, settings); return 1; }; int main(int argc, char *argv[]) { char path[500]= "C:\\Dokumente und Einstellungen\\eggers.tilman\\Desktop\\iTEP-Export\\"; char empty[2] = ""; char testfile[500] = "C:\\Dokumente und Einstellungen\\eggers.tilman\\Desktop\\iTEP-Export\\iTEPControle.xml"; // printColorTable(); initDLL (); getchar(); initITEP_COMP(testfile,path,path,empty,path); getchar(); return EXIT_SUCCESS; } @ klotzkopp krieg ich die Ausgabe: init nicht gefunden (in schmuckem rot ) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 16. Januar 2008 Teilen Geschrieben 16. Januar 2008 krieg ich die Ausgabe: init nicht gefunden (in schmuckem rot )Das heißt, GetProcAddress schlägt fehl? Was sagt denn GetLastError dazu? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 16. Januar 2008 Teilen Geschrieben 16. Januar 2008 Ich bin mir jetzt nicht ganz sicher weil ich es zu lange nicht merh gemacht habe, aber sollte das result = (*function) (a,; [/PHP] nicht so aussehen [PHP] result = function (a,; ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
d.uNd.eE Geschrieben 16. Januar 2008 Autor Teilen Geschrieben 16. Januar 2008 126 also ERROR_MOD_NOT_FOUND Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 16. Januar 2008 Teilen Geschrieben 16. Januar 2008 Ist dir klar, dass du die DLL in deiner initDLL-Funktion zweimal entlädst? Wenn du nur einen der beiden FreeLibrary-Aufrufe entfernst und den anderen drinlässt, ist klar, dass du die DLL neu laden musst. Ansonsten zeig doch bitte mal den Code, der nicht funktioniert. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
d.uNd.eE Geschrieben 16. Januar 2008 Autor Teilen Geschrieben 16. Januar 2008 @Guybrush Threepwood Ist doch ne externe Funktion aus der DLL. so, wie du schreibst spricht man funktionen direkt an. Da ich von der aus der DLL aber ja nur die Adresse habe muss ich sie über den Adressoperator ansprechen @Klotzkopp danke an dein waches Auge, sollte noch in die else Anweisung(vor die klammer) *kopf auf tischkante* Daran hats gelegen Funkt jetzt einwandfrei vielen vielen dank und...naja...kann man ja theoritsch auch wieder in den "ich hab n doofen fehler gemacht" thread verschieben^^ jetz frag ich mich grad, wieso if(hinstLib==NULL) { setColor(12); cout<<"DLL nicht geladen"<<endl; setColor(15); getchar(); return 0; }; [/PHP] nicht gearbeitet hat Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 16. Januar 2008 Teilen Geschrieben 16. Januar 2008 @Guybrush Threepwood Ist doch ne externe Funktion aus der DLL. so, wie du schreibst spricht man funktionen direkt an. Da ich von der aus der DLL aber ja nur die Adresse habe muss ich sie über den Adressoperator ansprechen Ob die Funktion aus ner DLL kommt oder nicht ist dabei egal, du hast einen Funktionspointer der auf die Adresse der Funktion im Speicher zeigt. Find ich jetzt etwas komisch das es mit und ohne dereferenzierung funktioniert... Beispiel #include <stdio.h> void foo() { printf ("OK\n"); } typedef void (*TEST)(); int main() { foo(); TEST t = foo; t(); (*t)(); getchar(); return 0; } [/PHP] gibt OK OK OK [/Quote] aus. Ich hätte jetzt vermutet das (*t)(); mit einer Zugriffsverletzung fehlschlägt... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
d.uNd.eE Geschrieben 16. Januar 2008 Autor Teilen Geschrieben 16. Januar 2008 da bin ich jetzt bei t(); von ausgegangen...aber gut, man lernt ja nie aus Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 16. Januar 2008 Teilen Geschrieben 16. Januar 2008 @Klotzkopp danke an dein waches Auge, sollte noch in die else Anweisung(vor die klammer) Ganz nebenbei: Der letzte else-Block in initDLL wird sowieso nie ausgeführt, weil du schon vorher aus der Funktion rausspringst, wenn hinstLib NULL ist. Das zugehörige if ist danach immer wahr, kann also auch wegfallen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 16. Januar 2008 Teilen Geschrieben 16. Januar 2008 da bin ich jetzt bei t(); von ausgegangen...aber gut, man lernt ja nie aus (*foo)(); funktioniert in obigen Beispiel übrigens auch, echt interessant (bzw. merkwürdig)... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.