Mam definicję interfejsu:
unit intfPlugins;
// Definicja głównego interfejsu wtyczek
type
IPlug = interface(IInterface)
[SID_IPlug]
function Init(ap: IPlugsApplication; TabH: HWND; ACliHandle: Pointer = nil): HResult; stdcall;
function InitSettingsTab(TabH: HWND; out FormH: HWND): HRESULT; stdcall;
end;
// Rozszerzenie głównego interfejsu o wtyczkę SMS
type
IPluginSMS = interface(IPlug)
[SID_IPlugSMS]
procedure SendSMS(APhoneNumber, AMessage: PAnsiChar); stdcall;
procedure SendSMS_Form(APhoneNumber, AReceiverName: PAnsiChar); stdcall;
end;
następnie w DLL implementuję ten interfejs poprzez dziedziczenie:
unit implPluginSMS
type
TSMSModule = class(TComObject, IPluginSMS, ISettings)
private
public
//IPluginSMS
procedure SendSMS(APhoneNumber, AMessage: PAnsiChar); stdcall;
procedure SendSMS_Form(APhoneNumber: PAnsiChar; AReceiverName: PAnsiChar); stdcall;
//ISettings
procedure LoadSettings; stdcall;
procedure SaveSettings; stdcall;
public
procedure Initialize; override;
destructor Destroy; override;
end;
procedure TSMSModule.SendSMS(APhoneNumber, AMessage: PAnsiChar);
begin
// kod wyslania SMS
end;
procedure TSMSModule.SendSMS_Form(APhoneNumber, AReceiverName: PAnsiChar);
var
SMS: TfrmSendSMS;
begin
SMS := TfrmSendSMS.Create(Application);
try
SMS.Start(APhoneNumber, AReceiverName);
SMS.ShowModal;
finally
SMS.Free;
SMS := nil;
end;
end;
Pytanie brzmi w jaki sposób odwołać się do procedury interfejsu SendSMS z poziomu okna frmSendSMS? Dodam, że procedury IPluginSMS są widoczne dla aplikacji rodzica tzn:
W aplikacji głównej wywołuję metodę IPlug.INIT a w niej, szukam pochodnej intererfejsu IPluginSMS, wówczas otrzymuję dostęp do jego implementacji.
Klasa TSMSModule jest tworzona przy inicjalizacji DLL za pomocą fabryki.
initialization
CoInitialize(nil);
TSMSPlugFactory.Create(ComServer, TSMSModule, CLSID_ModulSMS, '',
'Moduł SMS', ciMultiInstance, tmApartment);