On Saturday 18 November 2000 00:49, Reinhard Foerster wrote:
On Fri, Nov 17, 2000 at 10:47:24PM +0100, Konrad Rosenbaum wrote:
(ich habe Mechanismus b) noch nicht benutzt. Stimmt das, was ich hier gesagt habe? Stefan G.???)
Im Grunde ist es richtig, aber Du solltest auch wissen, welche Parameter Du brauchst, sonst bekommst Du einen netten SIGSEGV (auch unter dem Pseudonym "signal 11" bekannt). Es funktioniert etwa so:
Die Parameter muessen natuerlich dann genau wie die Namen der Funktionen ueber andere vordefinierte Funktionen abfragbar sein.
Nenn mir bitte welche. Die einzige Moeglichkeit, die mir noch einfiele waere die libELF, aber da steht auch nix ueber Parameter drin.
Dreimal darfst Du raten, warum in C immer nur 1 Symbol mit einem Namen existieren darf und nicht mehrere wie in C++ (das ja bekanntlich scheusliche Symbolnamen in die Dateien eintraegt).
#include <dlfcn.h>
... void *handle=dlopen("libNixWeiter.so",RTLD_GLOBAL|RTLD_NOW);
if(handle==NULL)/*is schiefgegangen, keine libNixWeiter vorhanden*/ exit(1);
void (*somefunc)()=dlsym(handle,"soEineFunktion");
if(somefunc!=NULL) /*rufen wir das Teil mal auf:*/ somefunc();
/*aus der Spuk:*/ dlclose(handle);
Ja - das ist die Billig-Variante, bei der alle Funktionsnamen bekannt sein muessen. Dafuer wuerde ich nicht dl*() verwenden. Ich wollte dann z.B. ueber "soEineFunktion" ermitteln, was libNixWeiter.so noch so alles anbietet (Funktionsnamen+Parameter), davon dann wieder per dlsym() die Adressen bekommen und die Funktionen nutzen. Erst dann sehe ich eine Sinn in der Nutzung von dl*().
Dann musst Du den ganzen Krempel ja selbst in deine Funktion einprogrammieren! Das ist nun wirklich kompliziert gedacht. Einfacher sind Factories, was aber nur bei OO geht. Oder Du hast halt ein eindeutiges Interface definiert und wenn sich die dll nicht dran haelt wird sie eben in deinem Proggy nicht genutzt (AFAIK macht das Netscape so).
Ausserdem kannst Du Dir statt der Funktionsnamen dann auch gleich Pointer geben lassen (das waere dann sogar sicherer).
Oder faellt Dir irgendeine bessere Bibliothek als libdl ein?
Konrad