Einzelnen Beitrag anzeigen

BloodySmartie
(Gast)

n/a Beiträge
 
#8

Re: Prozedurale Typen zur Laufzeit erstellen?

  Alt 30. Mai 2008, 16:10
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.
  Mit Zitat antworten Zitat