Du bist nicht angemeldet.

Werbeanzeige

11

24.08.2004, 14:02

Ich will das mal auseinander nehmen:

1) Du Initialisierst deinen Zeiger m_pServer (der vom Typ IBasePlugIn ist) mit NULL.

2) Du übergibst dann die Adresse von m_pServer (in deinem Beispiel ist das die Adresse 0x00861004).

3) Deine PlugIn-Instanz wird erzeugt und dessen Adresse ist 0x008828a8.

Hmm...sieht für mich alles richtig aus. Natürlich haben die Adresse deiner Member-Variable einen anderen Wert als die Adresse der PlugIn-Instanz. Sonst wäre es ja kein Pointer sondern eine Referenz ;)

An deinem gezeigten Code kann ich keine Fehler entdecken.

Was passiert denn wenn du eine virtuelle Methode aufrufst? Hast du auch geprüft das nicht inerhalb der Methode ein Fehler vorliegt?
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

12

24.08.2004, 14:57

Wenn ich den Zeiger aus dem Programm benutzen will, um eine Methode aus dem Plugin aufzurufen, dabei kommt sowohl bei einer Methode, die aus dem Interface überschrieben wurde, als auch bei einer Methode aus dem konkreten Plugin die Fehlermeldung:

error C2027: Verwendung des undefinierten Typs "IBasePlugin"
[

Ansonsten hatte ich den Vorgang genau beschrieben.
Ich kann dir gerne den Code mal schicken, er besteht nur aus 7 kleinen Dateien, weil es sich ja nur um eine Testumgebung handelt. Ich kann ihn auch hier posten, nur wird das dann eher ein bisschen unübersichtlich!

13

24.08.2004, 15:10

Brauchst mir den Code nicht schicken. Ich weis wo der Fehler liegt. Du solltest dir zwei Sachen durchlesen.
1) Mein obiges Posting vom 23.August.
2) Die Erklärung der Fehlermeldung.

Dann sollte eigentlich schon alles klar sein. Du willst eine KLasse verwenden dessen Beschreibung nicht vorliegt.

Zitat

In dem Modul ist es natürlich notwendig das du die IPlugIn.h einfügst. Da du hier ja gebrauch von der Klasse machst.

Sobald du das Interface benutzen willst, muss der Compiler natürlich auch die Definition des Interfaces vorliegen haben. Das hat nichts mit den Adressen zu tun :)
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

14

24.08.2004, 15:17

DragonMaster können wir mal in ICQ Reden, hab da paar Fragen zu Interface, SceneManager, Rendertechniken etc (Engine).

Wäre nett wenn du Zeit hättest.

IUN 82 921 889

thx

15

24.08.2004, 15:44

Ja stimmt, das war der Fehler :angel:

Ich hatte deine Aussage falsch verstanden, ich dachte du meintest mit Modul, dass jenige in dem ich eine konkrete Pluginklasse erstelle.

Jetzt habe ich quasi die Wahl ob ich das Interface direkt im Kernel inkludiere oder in der Anwendung. Im Kernel finde ich es praktischer, weil dann kann die Anwendung wieder mit einer Header Datei weniger auskommen.

Was mir nicht so gefällt an der Sache ist, dass so viele Klassen von einer zentralen Klasse abhängig sind. Das wäre dann der Kernel, der die Plugins und die Einstiegsfunktionen lädt und jede Einstiegsfunktion in einer SubEngine. Aber ich kenn auch keinen anderen Weg und vielleicht ist das auch gar nicht so schlimm ;)

Ich hab noch zwei andere Fragen (Verständnisfragen):
1.) Ich kann ja immer nur auf die Methoden der Basisklassen zugreifen, wie kann ich jetzt aber aus meiner Anwendung heraus auf Methoden aus den konkreten Klassen zugreifen, die nicht im Interface stehen. Oder geht das nicht?
2.) Wie kann man die "C" Bindekonvention ersetzen. Da ich versuchen wollte soviel wie möglich in C++ zu programmieren. Oder sind solche Ausnahmen legitim ???

Danke, noch mal für die super Erklärung und deine Hilfe für die Fehlerfindung. Du hast mir wirklich sehr geholfen. Und ich werde bestimmt bald wieder auf neue Ungereimtheiten stoßen :huhu:

@furbolg

Zitat

DragonMaster können wir mal in ICQ Reden, hab da paar Fragen zu Interface, SceneManager, Rendertechniken etc (Engine).


Wäre wirklich gut, wenn du Fragen im Forum klärst. Wie du siehst arbeite ich im Moment auch an dem gleichen Problem. SceneManager ist meine nächste Herausforderung und da wäre es doch wirklich angebracht, wenn wir unsere Informationen und Problemen hier austauschen und diskutieren könnten. Ich schreib ja auch all meine Probleme und wenn sie noch so dumm sind :angel:

16

24.08.2004, 16:34

Wie heißts so schön: Dumme Fragen gibt es nicht. Nur dumme Antworten. ;D


Zu 1: Schau dir mal dieses Posting an. Da steht schon alles drin.

Zu 2: In dem Fall ist es ligitim. Man kann auch eine C++ Funktion dafür nutzen. Dazu mal das hier

Zitat

Wenn du ein PlugIn-System aufbauen willst, ist es notwendig das dieses PlugIn eine Funktion nach den C Spezifikationen besitzt. Die sind einfacher zu laden C++ Funktionen können natürlich auch über GetProcAddress geladen werden, man must aber erst den qualifizierten Funktionsnamen aus der DLL lesen.
Posting von mir am 23.August. Gleicher Thread ;)
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

17

24.08.2004, 17:03

Hehe, also dumme Antworten habe ich hier noch keine bekommen.

Ich glaube das mit dem casten hat sich erledigt, weil ich ja genauso gut die Methoden in den konkreten Plugins überschreiben kann und dann dort die SubEngine ins "Rollen" bringe.
Es scheint dann eh besser zu sein, wie ein cast anzuwenden.

Ich denke das jetzt das Grundgerüst für mein PluginSystem steht und ich mich jetzt mehr mit der Organisation der SubEngines beschätigen kann.
Komponenten habe ich schon, nur ohne jede Struktur.

Ich werde "versuchen" für mein Graphics Subsystem einen Scene Graph zu machen. Doch leider findet man darüber nur wenig Informationen. Jeder kennt es, jeder will es, nur keiner erklärt es ordentich :crying:

Falls du da Informationen hast oder sogar eine Implementierung mit Erklärung, wäre echt super.

Soll ich für solche Themen lieber einen extra Thread aufmachen?

Anonymous

unregistriert

18

11.09.2004, 18:54

Ich habe jetzt auch versucht, die Klasse C aus dem Dll-Projekt zu laden, allerdings funktioniert es nicht! Wenn ich das Programm ausfühe kommt eine unverständliche Debug-Fehlermeldung:
Debug Error!
Program: D:\Versuch\Exe.exe
Module:
File: i386\chkesp.c
Line: 42
The value of ESP was not properly saved across a function call. blablabla

EXE.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//  #include

#include <windows.h>
#include "DLL/dll.h"


//  var

HMODULE hDll = NULL;
void (__stdcall* new_C)(C** p) = NULL;

C* Class;


//  WinMain()

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
    hDll = LoadLibrary("./DLL/Debug/DLL.dll");
    new_C = (void(__stdcall*)(C** p)) GetProcAddress(hDll,"new_C");

    new_C(&Class);

    FreeLibrary(hDll);
    return 0;
};


DLL/Dll.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
#include <windows.h>

class C
{
public:
    virtual void SetI(int _i);
    virtual int  GetI();

protected:
    int  i;
};


DLL/Dll.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "dll.h"


void C::SetI(int _i)
{
    i = _i;
}

int C::GetI()
{
    return i;
}


extern "C"
{
    __declspec(dllexport) void new_C(C** p)
    {
        *p = new C;
    }
}

bool WINAPI DllMain(HMODULE hModule,DWORD dwReason,LPVOID lpvReserved)
{
    return TRUE;
}


Muss die DllMain() eigentlich in der Dll sein, da ich eh nur TRUE zurückgebe?

Till

Alter Hase

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

19

11.09.2004, 21:21

Zitat von »"lumos"«

Muss die DllMain() eigentlich in der Dll sein, da ich eh nur TRUE zurückgebe?


Nee, glaub ich nich, ich benutze in einem meiner Projekte auch eine Art PlugIn-Dll von der mit GetProcAdress Funktionen abgeholt werden und die enthält kein DllMain(), funktioniert aber trotzdem...
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

20

11.09.2004, 23:12

BlueEye, eine schöne und bewährte Implementation eines Scene Graphen findest Du hier:
http://plib.sourceforge.net/
"Games are algorithmic entertainment."

Werbeanzeige