Zum Inhalt springen

Dynamiche DLL-Einbindung: vor jeder Funktion DLL neu binden?


d.uNd.eE

Empfohlene Beiträge

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,B);

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?

B) Wie kann ich das verhindern?

Statisch linken funktioniert nicht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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. :D

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,B);
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 :D)

Link zu diesem Kommentar
Auf anderen Seiten teilen

@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

Link zu diesem Kommentar
Auf anderen Seiten teilen

@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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

@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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...