DLL-Initialisierung

Antworten
abacom
Site Admin
Beiträge: 3333
Registriert: Dienstag 23. September 2008, 10:54
Kontaktdaten:

DLL-Initialisierung

Beitrag von abacom » Dienstag 14. Oktober 2008, 13:30

uwe



Anmeldungsdatum: 02.09.2008
Beiträge: 1


Verfasst am: 02 Sep 2008 14:25 Titel: DLL-Initialisierung

--------------------------------------------------------------------------------

Im alten Forum wurde vor einiger Zeit die DLL-Initialiserung besprochen. Da keine neueren Beiträge dort zu finden waren .. hier noch ein kleiner Nachtrag:

Problemstellung: Zur Laufzeit (beim Laden der DLL) soll die Anzahl der Ein- und Ausgänge und deren Bezeichnung festgelegt werden.

Lösung (mit dokumentierten Funktionen):
Beim Laden (Einbinden) der DLL in ProfiLab werden zur Initialisierung in einer bestimmten Reihenfolge Funktionen aufgerufen, z.B.:
1. Funktionsaufruf: NumInputs();
2. Funktionsaufruf: NumOutputs();
...

Durch Umschreiben der Funktion NumInputs() kann man vor Rückgabe der Anzahl der Eingänge eine beliebige Initialisierung vornehmen.

Meine Lösung basiert auf der Verwendung einer Klasse, die die gleichen ProfiLab-Parameter und -Funktionen zur DLL-Einbingund beinhaltet.

Code:

// c++
static PL_DLL_Template dll; // eigene Klasse ..

//Aufruf von PROFILAB, liest Anzahl der Eingänge
DLLEXPORT unsigned char _stdcall NumInputs()
{
dll = PL_DLL_Template();
return dll.Inputs;
}
//Aufruf von PROFILAB, liest Anzahl der Ausgänge
DLLEXPORT unsigned char _stdcall NumInputs()
{
return dll.Outputs;
}
//Aufruf von PROFILAB, liest die Namen der Eingänge
DLLEXPORT void _stdcall GetInputName(unsigned char Channel, unsigned char *Name)
{
dll.GetInputName(Channel, Name);
}

//Aufruf von PROFILAB, liest die Namen der Eingänge
DLLEXPORT void _stdcall GetOutputName(unsigned char Channel,unsigned char *Name)
{
dll.GetOutputName(Channel, Name);
}



Durch diese Vorgehensweise werden die vorgegebenen Export-Funktionen usw. einfach mit den Funktionen usw. der Klasse verknüpft. Ein Problem kann auftreten, wenn die DLL mehrfach in einem Projekt verwendet wird. Dann wird auf die global definierte Klasse gleichzeitig zugegriffen und kann ggf. zu Fehlern führen. Eine Lösung für diesen Problemfall ist z.B. durch ein Klassen-Array oder andere Listenstrukturen usw. denkbar. Bei Bedarf stelle ich den Code zur Verfügung.
ABACOM support

Antworten

Zurück zu „DLL-Programmierung“