# Funktionen aus Dll laden und alles in eine Klasse packen



## Tobias K. (11. April 2005)

moin


Also ich bin dabei ein Programm für ein USB-Interface zu schreiben.
Dafür habe ich eine Dll mit allen Funktionen drin, die daraus zuladen/benutzen ist kein Problem, nur wie kann ich das alles schon in eine Klasse packen sodass ich die Funktionen aus der Dll wie eine normale Methode aus der Klasse heraus aufrufen kann?


"Normal" lade ich sie im Prinzip so raus:

```
typedef long (_stdcall *f01)(long CardAddress);

f01 OpenDevice;

int main(void)
{

	HMODULE   hDll;

	hDll = LoadLibrary("K8055D.dll");
	if(hDll==NULL)
		return 1;


	OpenDevice = (f01)GetProcAddress(hDll,"OpenDevice");
	
        //Funktion benutzen
        OpenDevice(0);

	FreeLibrary(hDll);
	return 0;
}
```


mfg
umbrasaxum


----------



## Endurion (11. April 2005)

Wenn du die DLL selbst nicht verändern willst, kommst du um eine Klammer-Klasse nicht rum, die einfach die Aufrufe und eventuelle Instanz-IDs kapselt.

Wenn du die DLL selbst verändern kannst, dann mach die Klammer-Klasse in der DLL, leite sie aber von einem abstrakten Interface ab. Über eine "normale" Funktion lässt du dir von der DLL einen Pointer auf das Interface geben und kannst damit ganz normal arbeiten.

Achtung: Mach das Interface komplett abstrakt, sonst gibt's Heap-Probleme (hab ich ganz alleine rausgekriegt! Ist nämlich immer abgek**kt  )


----------



## Tobias K. (11. April 2005)

moin


Ich hab keine Möglichkeit die Dll zu verändern.

Was ist eine Klammer-Klasse?
Und hättest vielleicht grad ein, speziell auf mich bezogenes, Beispiel zur Hand? 


mfg
umbrasaxum


----------



## Endurion (12. April 2005)

Mit Klammerklasse meinte ich nur, dass du die Funktionsaufrufe von einer Klasse aus machst.
Die Klasse kümmert sich im Destruktor drum, dass eventuelle DLL-Handles wieder freigegeben werden. Ansonsten entspricht eine Memberfunktion der Klasse einer Funktion in der DLL. Ganz banal.

Für eine Funktion void TuWas( int iWasDenn ); würde eine Klasse sowas haben:


```
CMeineKlasse
{
  public:

    void Tuwas( int iWasDenn )
    {
      ::TuWas( iWasDenn );
    }
}
```

Viel mehr lässt sich da meines Erachtens nach nicht machen, ausser eventuell nötige DLL-Handles oder IDs mitzuschleifen.


----------



## Tobias K. (12. April 2005)

moiin


Ja so in der Artt ist das Problem jetzt auch gelöst, hab eine Klasse gefunden die noch mit dabei war.
Werde es aber nochmal selbst versuchen.

Danke für deine Hilfe.


mfg
umbrasaxum


----------

