Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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.

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)

126 also ERROR_MOD_NOT_FOUND

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.

@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

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

da bin ich jetzt bei t(); von ausgegangen...aber gut, man lernt ja nie aus

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.