Hallo,
da Delphi nicht die einzigste Programmiersprache ist, habe ich mir gedacht, mein Plugin System zu übersetzten. Bevor ich jedoch direkt damit anfange, habe ich mir ein kleines Testprogramm mit kleineren Funktionen geschrieben, welche Widestring's, PWideChar's, Integer's oder ähnliches im Plugin Manipulieren.
Nun bin ich aber dabei auch ganze Klassen dem Plugin zu übergeben.
Aus dieser Basisklasse werden alle weiteren Plugins abgeleitet.
Delphi-Quellcode:
TPlugIn = class
//private
//FErrorMsg: WideString;
public
constructor Create; virtual;
function GetName: PWideChar; virtual; stdcall; abstract;
function GetParentClassName: PWideChar; virtual; stdcall; abstract;
//property ErrorMsg: WideString read FErrorMsg write FErrorMsg;
end;
constructor TPlugIn.Create;
begin
inherited Create;
end;
Nun folgt mein erster C++ Ansatz:
Frage 1: Ist das so korrekt?
Header Datei
Code:
#pragma once
class TPlugIn
{
public:
TPlugIn(void);
// ~TPlugIn(void);
virtual void _stdcall GetName(LPWSTR* result) = 0;
virtual void _stdcall GetParentClassName(LPWSTR* result) = 0;
};
Code:
#include "StdAfx.h"
#include "TPlugIn.h"
TPlugIn::TPlugIn(void)
{
}
== == == ==
Das Pluginsystem lädt das PlugIn und erstellt eine Plugin interne abgeleitete Klasse von TPlugIn:
Delphi-Quellcode:
function LoadPlugin(var PlugIn: TPlugIn): Boolean; export;
begin
try
PlugIn := TMyPlugIn.Create;
Result := True;
except
Result := False;
end;
end;
Problem 1: Wie erstellt man eine Klasse die als Referenzparameter übergeben wird?
Code:
bool LoadPlugIn(TPlugIn &PlugIn) // oder mit Sternchen ? - mit ohne alles geht gar nicht
{
//TMyPlugIn PlugIn; // klappt nicht
//PlugIn = new TMyPlugIn // klappt auch nicht
TMyPlugIn cPlugIn; // so vielleicht ?
PlugIn = cPlugIn;
return TRUE;
}
Wenn ich das jetzt einfach so starte bekomme ich eine Zugriffsverletzung.