Wow...so viele Antworten in so kurzer Zeit
Also ich arbeite gerade an einem Plugin-System, wobei ich für die Kommunikation zwischen Anwendung und Plugin halt auf fest definierte Funktionen setze, die die Anwendung in der Bibliothek aufrufen kann, sowie auf Callbacks, die die
DLL selbst wiederum anspricht.
Nun muss man aber(nach meinem Wissensstand) bereits zur Entwurfszeit mindestens wissen, welche Parameter und Rückgabewerte Methoden aus der
DLL besitzen. Damit meine ich, dass man das
Programm für das Plugin anpassen muss. Deshalb habe ich mir die Frage gestellt, ob sich nicht gewissermaßen die
Anwendung an das Plugin "anpassen" könnte. Vermutlich wäre das möglich, wenn ich Prozedurale Typen zur Laufzeit festlegen könnte.
Ich zeig Euch mal in Quelltextform, was ich meine:
DLL:
Delphi-Quellcode:
//Fehler? Nehmt es als Pseudocode ;)
...
Type TParameterType=(ptInt,ptSingle,ptString);
Type TUnknownProc=record
procName:string;
Parameters:array of TParameterType;
end;
function getInformationAboutAnUnknownProc:TParameterType;
begin
result.procName:='doSomething';
setlength(result.Parameters,1);
result.Parameters[0]:=ptInt;
end;
procedure doSomething(a:integer);
begin
showmessage(inttostr(a));
end;
...
exports
getInformationAboutAnUnknownProc name 'getInformationAboutAnUnkownProc',
doSomething name 'doSomething';
Die mir bekannte Vorgehensweise in der Anwendung wäre nun:
Delphi-Quellcode:
//Fehler? Nehmt es als Pseudocode ;)
...
type TGetInfoFunc=function:TParameterType;
...
var GetInfos : TGetInfoFunc;
...
function Load_DLL (const dllfilename:string) :boolean;
begin
dllhandle := LoadLibrary(pchar(dllfilename));
if (dllhandle <> 0) then
GetInfos := GetProcAdress(dllhandle,pchar('GetSomeInformationAboutAnUnkownProc'));
end;
...
Wie Ihr seht, habe ich zunächst einen - zugegeben sehr einfachen - prozeduralen Typen "TGetInfoProc" deklariert, um dann eine entsprechende Funktion aus der
DLL in mein Programm einzubinden. So weit, so gut.
Wie Ihr ebenfalls erkennen könnt, habe ich das für "doSomething" nicht getan - weil ich diese Funktion zur Entwurfszeit der Anwendung vielleicht noch nicht kannte. Nun habe ich mir gedacht, dass es doch cool wäre, wenn ich auch dafür einen solchen prozeduralen Typen basteln/erstellen/weiss-der-Fuchs-was könnte, um die noch unbekannte Funktion einzubinden. "GetSomeInformationAboutAnUnknownProc" liefert mir die Daten dafür. Jetzt würd' ich halt irgendwelche Delphi-Magie in Gang setzen wollen, um die Funktion ebenfalls nutzbar machen zu können.
Ich hoffe, das ich das jetzt einigermaßen verständlich schildern konnte.