Schon mal aufgefallen, was du da machst?
Delphi-Quelltext
1: 2: 3:
| Handle := LoadLibrary(...); FreeLibrary(Handle); r := Handle; |
das sollte eventuell:
Delphi-Quelltext
1: 2: 3: 4:
| Handle := LoadLibrary(...); r := Handle; FormName.Caption := FloatToStr(r); FreeLibrary(Handle); |
sein.
Grund: nach FreeLibrary ist dein Handle nicht mehr gültig und besitzt den Wert 0. Daher kommt der. Du kannst ja prüfen, ob deine Sachen alle geladen werden. schreib dir ne funktion, die dir deine aufrufe mitloggt (irgendwohin. Memo, Textdatei, was weiß ich):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| Handle := LoadLibrary(...); if Handle=0 then begin LogMessage('failed when loading library'); end else begin LogMessage('library successfully loaded'); @Plugin := GetProcAddress(Handle, 'Sampleprocedure'); if @Plugin <> nil then begin Plugin; LogMessage('successfully called procedure »Sampleprocedure«'); end else begin LogMessage('failed to call »Sampleprocedure«'); end; FormName.Caption := StrToInt(Integer(Handle)); FreeLibrary(Handle); end; |
Um das ganze noch sicherer zu machen solltest du für den Aufruf GetProcAddress eine Konstante verwenden:
Delphi-Quelltext
1: 2: 3: 4: 5:
| const PLUGIN_INIT_PROC = 'Sampleprocedure';
GetProcAddress(Handle, PLUGIN_INIT_PROC); |
Der Grund dafür ist, dass die GetProcAddress auf die Groß/Kleinschreibung achtet. Ist halt ne Win32 Funktion...
Du experimentierst also gerade mit Plugins. Wenn du bis heute Abend Zeit hast, dann meld dich. Ich hab neulich mal ein Beispielpluginframework für einen bekannten geschrieben, das auf DLLs und Interfaces basiert. Läuft dann im Prinzip so ähnlich wie die Delphi IDE Erweiterung: Du fragst das Hauptprogramm auf irgendwelche Services ab (z.B. IMenuService) und wenn ja, kannst dir einen Menüpunkt registrieren und so weiter
Gruß