Hallo,
ich bin es noch einmal. Da es sich irgendwie noch auf das selbe Thema bezieht, hoffe ich das ich hier noch etwas hinzufügen darf,
da es noch etwas mit der Parameterübergabe zu tun hat. Falls nicht mach ich dann nen neues Thema auf.
Das klappt alles soweit, Wenn ich allerdings versuche die DLLs einem Item vom Typ TCollectionItem hinzuzufügen, kann ich auf nichts mehr zugreifen. Mir scheint als sei in dem Fall die Speicherverwaltung hin oder?
Delphi-Quellcode:
procedure TForm1.Btn_LoadClick(Sender: TObject);
begin
if Opendialog.Execute then begin
Lib := LoadLibrary(PChar(OpenDialog.FileName));
if Lib = 0 then
ShowMessage('Plugin konnte nicht geladen werden!');
@PluginData := GetProcAddress(Lib, 'PluginData');
PluginData(PPlugData);
Self.JvListBox1.Items.Add(Format('Typ: %d', [PlugData.PluginType]));
Self.JvListBox1.Items.Add(Format('Name: %s', [PlugData.PluginName]));
Self.JvListBox1.Items.Add(Format('Author: %s', [PlugData.PluginAuthor]));
Self.JvListBox1.Items.Add(Format('Version: %s', [PlugData.PluginVersion]));
Btn_Config.Enabled := PlugData.PluginCanConfig;
if Lib <> 0 then begin
@PluginCallBack := GetProcAddress(Lib, 'SetCallBack');
PluginCallBack(@DLLAufruf);
end;
end;
end;
Wenn ich das einfach so aufrufe, gibt es keine Probleme, auch beim laden mehrerer Plugins. Alle verrichten auch ihren Dienst so wie sie es sollen. Dort habe ich aber ja keine Übersicht der Plugins.
Eigentlich das gleiche wie Oben nur das ich jetzt noch ein CollectionItem dabei nutze.
Delphi-Quellcode:
type
TPlugData =
packed record
PluginType: Integer;
PluginCanConfig: Boolean;
PluginName: PChar;
PluginAuthor: PChar;
PluginVersion: PChar;
end;
TPPlugData = ^TPlugData;
[...]
procedure TForm1.Btn_ManagerClick(Sender: TObject);
var
I: Integer;
MC_Plugin: TMC_Plugin;
begin
if Opendialog.Execute
then begin
Lib := LoadLibrary(PChar(OpenDialog.FileName));
if Lib = 0
then
ShowMessage('
Plugin konnte nicht geladen werden!');
@PluginData := GetProcAddress(Lib, '
PluginData');
PluginData(PPlugData);
// <-- TPPlugData - Lasse ich den EIntrag weg, kommt keine AV
if Lib <> 0
then begin
@PluginCallBack := GetProcAddress(Lib, '
SetCallBack');
PluginCallBack(@DLLAufruf);
MC_Plugin := FMC_Plugins.Add;
MC_Plugin.
Name := PlugData.PluginName;
MC_Plugin.Author := PlugData.PluginAuthor;
MC_Plugin.Version := PlugData.PluginVersion;
MC_Plugin.Description := '
';
Self.JvStatusBar1.Panels[0].Text := InttoStr(FMC_Plugins.Count);
// AV - Kann plötzlich nicht mehr auf Komponenten zugreifen
end;
end;
end;
Die Collection schaut so aus...
Delphi-Quellcode:
type
TMC_Plugin =
class(TCollectionItem)
private
FHandle: Cardinal;
FFilename:
String;
FName:
String;
FAuthor:
String;
FDescription:
String;
FVersion:
String;
FPluginType: Integer;
FCanConfig: Boolean;
FStatus: Integer;
public
property Handle: Cardinal
read FHandle
write FHandle;
property Filename:
String read FFilename
write FFilename;
property Name:
string read FName
write FName;
property Author:
String read FAuthor
write FAuthor;
property Description:
String read FDescription
write FDescription;
property Version:
String read FVersion
write FVersion;
property PluginType: Integer
read FPluginType
write FPluginType;
property CanConfig: Boolean
read FCanConfig
write FCanConfig;
property Status: Integer
read FStatus
write FStatus;
end;
type
TMC_Plugins =
class(TCollection)
private
function GetPlugins(
Index: Integer): TMC_Plugin;
public
constructor Create;
destructor Destroy;
override;
function Add: TMC_Plugin;
function Del(
Index: Integer): Boolean;
property Plugins[
Index: Integer]: TMC_Plugin
read GetPlugins;
end;
Dem Item kann ich die Recordwerte noch hinzufügen aber danach bricht alles zusammen.
Zitat:
---------------------------
Debugger Fault Notification
---------------------------
Project D:\Develop\Delphi\Projects\MediaCenter\Testanwendu ng.exe faulted with message: '
access violation at 0x0013f771: read of address 0xd8002829'. Process Stopped. Use Step or Run to continue.
---------------------------
OK
---------------------------
Ist es weil der Record keine feste Größe hat?