bitmaster5714
Grünschnabel
Hi!
Ich hatte die Idee zur Übung von DLLs ein kleines Plugin-System in C++ zu schreiben.
Nun bin ich schon fast fertig. Ich habe die DLLs geschrieben, getestet und sie gehen.
Im Moment bin ich jedoch auf ein Problem gestoßen bei dem ich keine Lösung finde:
Mein Plugin-System lädt die DLLs schon, aber es endet immer mit einer Zugriffsverletzung (komischerweise beim FreeLibrary Befehl). Ich konnte mit dem Turbo Debugger von Borland die Stelle ausmachen jedoch kenne ich keine Problemlösung. Ich zeig euch mal ein paar Quellen (wundert euch nicht über den Namen des 2.Plugins(es wird nicht beabsichtigt einen insterstellaren Raumkreuzer zu starten
):
Test-Plugin 1: uebung1.dll (uebung1.cpp)
Test-Plugin 2: startraumkreuzer.dll (startraumkreuzer.cpp)
Nun das Ladeprogramm:
Wenn Ihr ebenfalls keine Lösung findet, oder nur keinen Bock habt, dann ist das auch
nicht so schlimm. Ist ja nur eine Übung.
Vielen Dank schon für das Durchlesen des Themas.
cu.
Ich hatte die Idee zur Übung von DLLs ein kleines Plugin-System in C++ zu schreiben.
Nun bin ich schon fast fertig. Ich habe die DLLs geschrieben, getestet und sie gehen.
Im Moment bin ich jedoch auf ein Problem gestoßen bei dem ich keine Lösung finde:
Mein Plugin-System lädt die DLLs schon, aber es endet immer mit einer Zugriffsverletzung (komischerweise beim FreeLibrary Befehl). Ich konnte mit dem Turbo Debugger von Borland die Stelle ausmachen jedoch kenne ich keine Problemlösung. Ich zeig euch mal ein paar Quellen (wundert euch nicht über den Namen des 2.Plugins(es wird nicht beabsichtigt einen insterstellaren Raumkreuzer zu starten
![Smile :-) :-)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f642.png)
Test-Plugin 1: uebung1.dll (uebung1.cpp)
Code:
#include <windows.h>
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) char *GetName() {
char *buffer = "Test Dynamic Link Library 0.1";
return buffer;
}
#ifdef __cplusplus
}
#endif
Test-Plugin 2: startraumkreuzer.dll (startraumkreuzer.cpp)
Code:
#include <windows.h>
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) char *GetName() {
char *buffer = "Bibliothek zum Starten interstellarer Raumkreuzer 0.1 a\000";
return buffer;
}
#ifdef __cplusplus
}
#endif
Nun das Ladeprogramm:
Code:
#include <windows.h>
#include <iostream>
typedef char *(*GETNAME) ();
using namespace std;
void initError(int code) {
switch(code) {
case 1: MessageBox(NULL, "Fehler beim Finden von Plugins", "Fehler", MB_OK | MB_ICONSTOP); break;
case 2: MessageBox(NULL, "Fehler beim Laden des Plugins", "Fehler", MB_OK | MB_ICONSTOP); break;
case 3: MessageBox(NULL, "Fehler beim Initialisieren des Plugins", "Fehler", MB_OK | MB_ICONSTOP); break;
}
}
void main(void) {
char *PlugName = NULL;
GETNAME GetName = NULL; // Funktionspointer zum Identifizieren
HANDLE hFind = NULL; // Findhandle
HINSTANCE hDLL = NULL; // DLL-Handle
LPWIN32_FIND_DATA lw32fd; // Find Structure
hFind = FindFirstFile("*.dll", lw32fd); // Plugin-Dateien finden
// Diverse Fehler die Auftreten können werden abgefangen
if(hFind == INVALID_HANDLE_VALUE) {initError(1); return;}
cout << "Found:" << lw32fd->cFileName << endl;
hDLL = LoadLibrary(lw32fd->cFileName);
if(hDLL == NULL) {initError(2); return;}
GetName = (GETNAME) GetProcAddress(hDLL, "_GetName");
if(GetName == NULL) {initError(3); FreeLibrary(hDLL);return;};
printf("Loaded: %s", GetName());
// Unfertig. Wird später um FindFileNext() usw. erweitert...
/* while(true) {
break;
}*/
FreeLibrary(hDLL);
//return;
}
Wenn Ihr ebenfalls keine Lösung findet, oder nur keinen Bock habt, dann ist das auch
nicht so schlimm. Ist ja nur eine Übung.
Vielen Dank schon für das Durchlesen des Themas.
cu.