Para un marco de plugin del lado del servidor Me gustaría implementar DLL que expongan un método RegisterPlugin que devuelve una referencia de clase (TInterfacedClass).Gestión de memoria para un marco de plugin Delphi basado en TInterfacedClass
La aplicación de host luego crea la (s) instancia (s) de esta clase, y las instancias se ejecutarán en el contexto de la (s) cadena (s) de host. (Esto es diferente, por ejemplo, del marco de plugin Jedi VCL, que instancia el plugin en el DLL o BPL y devuelve la instancia al host.)
Las primeras pruebas no mostraron problemas hasta el momento. Sin embargo, ¿hay problemas ocultos con la gestión de memoria de los que debería tener conocimiento? Como uso Delphi 2009 para este proyecto, FastMM4 es el administrador de memoria predeterminado.
aquí un bosquejo del proyecto de plugin DLL:
library ExamplePlugin;
uses
...
type
TPluginOne = class(TInterfacedObject, ...)
...
end;
function RegisterPlugin: TInterfacedClass; stdcall;
begin
Result := TPluginOne;
end;
exports
RegisterPlugin;
{ TPluginOne }
// ... plugin class implementation
begin
end.
La interfaz de fábrica funcionaría con todas las versiones de Delphi (siempre que la interfaz asociada con el GUID sea la misma en el host y en la DLL? – mjn
Esto es COM, ¿no? –
@mjin, sí, las interfaces tienen una interfaz bien definida interfaz binaria. Se espera que las interfaces con un GUID dado (y de confianza por el compilador) tengan un cierto VMT. * Ejercicio: * Defina la interfaz 'ITestIntf' en la unidad A. Copie y pegue la misma definición en la unidad B. Si intenta hacer 'var i1: A.ITestIntf: = B.ITestIntf' el compilador se quejará porque el' A.ITestIntf' no es compatible con 'B.ITestIntf'. Si lo hace' var i1: A.ITestIntf: = B.ITestIntf as A.ITestIntf' la asignación funciona como se espera porque ambas declaraciones tienen el mismo GUID. –