рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реИ?
рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрдиреНрд╕ рд▓рд┐рдЦрдирд╛ рдЕрдХреНрд╕рд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрдХреНрд╖рд╛рдУрдВ рдХреА рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЕрд╕рдВрдЧрддрд┐ рдХреЗ рдХрд╛рд░рдг, рдЗрди рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рдорд╛рди рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред C ++ рдореЗрдВ, рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдореЗрдВ рд░рдЦрдиреЗ рдХрд╛ рд░рд┐рд╡рд╛рдЬрд╝ рд╣реИред рдпрджрд┐ рдЖрдк рдХреБрдЫ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдХрдИ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ) рдФрд░ рдЕрдореВрд░реНрдд рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╡рд┐рднрд┐рдиреНрди рд╕реА ++ рд╕рдВрдХрд▓рдХ рдХреЗ рддрд╣рдд рд╕рдВрдХрд▓рд┐рдд рдкреНрд▓рдЧ-рдЗрди рдЪрд▓рд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рд╕реА ++ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдлреНрд░реА рдкрд╛рд╕реНрдХрд▓ рдХрдВрдкрд╛рдЗрд▓рд░ (рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд▓рдЧрдЗрди рдирд╣реАрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦреЗ рдЧрдП рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред
VMT рдХреНрдпрд╛ рд╣реИ?
рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдердб рдЯреЗрдмрд▓ (рд╡реАрдПрдордЯреА) рдПрдХ рд╕рдордиреНрд╡рдп рд╕рд╛рд░рдгреА рд╣реИ рдпрд╛ рд╡рд╛рдЗрдмреЗрдЯрд░ рдПрдХ рдРрд╕реА рдкреНрд░рдгрд╛рд▓реА рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдорд┐рд▓рд╛рди (рдпрд╛ рджреЗрд░ рд╕реЗ рдмрд╛рдзреНрдпрдХрд╛рд░реА) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕реА ++ рдорд╛рдирдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЧрддрд┐рд╢реАрд▓ рд╕рдордиреНрд╡рдп рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрдХреНрд╕рд░ рдПрдХ рд╣реА рдЖрдзрд╛рд░ рдореЙрдбрд▓ рдХреЗ рдХреБрдЫ рд░реВрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдЖрдорддреМрд░ рдкрд░, рдХрдВрдкрд╛рдЗрд▓рд░ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрддрд╛ рдмрдирд╛рддрд╛ рд╣реИред рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕ рд╡реЙрдпрдЯреЗрдмрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░, рдЬрд┐рд╕реЗ рд╡рд░реНрдЪреБрдЕрд▓ рдЯреЗрдмрд▓ рдкреЙрдЗрдВрдЯрд░ рдпрд╛ vpointer рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬрд┐рд╕реЗ рдХрднреА-рдХрднреА vptr рдпрд╛ vfptr рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ), рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЫрд┐рдкреЗ рд╣реБрдП рд╕рджрд╕реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рдЕрдХреНрд╕рд░ рдкрд╣рд▓реЗ рд╕рджрд╕реНрдп рдХреЗ рд░реВрдк рдореЗрдВ)ред рдХрдВрдкрд╛рдЗрд▓рд░ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ "рдЫрд┐рдкрд╛ рд╣реБрдЖ" рдХреЛрдб рднреА рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкрддреЗ рдХреЗ рд╕рд╛рде vpointer'ov рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
(рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдкреИрд░рд╛рдЧреНрд░рд╛рдлред)
рдмреЛрдзред
рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдкрд╛рд╕реНрдХрд▓ рдореЗрдВ рдХреЛрдб рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдЖрд╡рд░рдг рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
plugin.hpp#pragma once #include "ApiEntry.hpp" class IPlugin { public: virtual void APIENTRY free () = 0; virtual void APIENTRY print () = 0; }; class Plugin : public IPlugin { public: virtual void APIENTRY free (); virtual void APIENTRY print (); Plugin (); virtual ~Plugin (); private: void* thisPascal; }; extern "C" IPlugin* APIENTRY getNewPlugin ();
рдЬрд╣рд╛рдВ IPlugin рдкреНрд▓рдЧрдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред рдФрд░ рдпрд╣ рдкрд╛рд╕реНрдХрд▓ рдкрд╛рд╕реНрдХрд▓ рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд░реНрдЧ рдХреЗ рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИред
рдФрд░ рд░реИрдкрд░ рдХреЛрдб рд╣реА:
plugin.cpp #include "plugin.hpp" #include "pascalunit.hpp" #include <iostream> void APIENTRY Plugin::free () { IPlugin_release (thisPascal); delete this; } void APIENTRY Plugin::print () { IPlugin_print (thisPascal); } Plugin::Plugin () { std::cout << "Plugin::Plugin" << std::endl; thisPascal = IPlugin_getNewPlugin (); } Plugin::~Plugin () { std::cout << "Plugin::~Plugin" << std::endl; } extern "C" IPlugin* APIENTRY getNewPlugin () { Plugin* plugin = new Plugin (); return plugin; }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЛрдб рдкрд╛рд╕реНрдХрд▓ рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкрд╛рд╕реНрдХрд▓ рдореЗрдВ рдкреНрд▓рдЧрдЗрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХреНрд▓рд╛рд╕ рдмрдирд╛рддреЗ рд╕рдордп рдкрд╣рд▓реЗ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рдерд╛ред getNewPlugin рдХреЛ рдореЗрди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдкреНрд▓рдЧрдЗрди рдХреНрд▓рд╛рд╕ рдХреЛ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм рдЪрд▓реЛ рдкрд╛рд╕реНрдХрд▓ рдореЗрдВ рдкреНрд▓рдЧрдЗрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред
library pascalunit; {$MODE OBJFPC} uses ctypes; type IPlugin = interface procedure _release (); cdecl; procedure print (); cdecl; end; TPlugin = class (TInterfacedObject, IPlugin) public procedure _release (); cdecl; procedure print (); cdecl; constructor Create (); destructor Free (); end; PPlugin = ^TPlugin; procedure TPlugin._release (); cdecl; begin Free; end; procedure TPlugin.print (); cdecl; begin writeln ('Hello World'); end; procedure _release (this: PPlugin); cdecl; begin this^._release (); end; procedure print (this: PPlugin); cdecl; begin this^.print (); end; constructor TPlugin.Create (); begin inherited; writeln ('TPlugin.Create'); end; destructor TPlugin.Free (); begin writeln ('TPlugin.Free'); end; function getNewPlugin (): PPlugin; cdecl; var plugin: PPlugin; begin New (plugin); plugin^ := TPlugin.Create (); result := plugin; end; exports getNewPlugin name 'IPlugin_getNewPlugin', print name 'IPlugin_print', _release name 'IPlugin_release'; begin end.
рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдкрд╛рд╕реНрдХрд▓ рдореЗрдВ рд▓рдЧрднрдЧ рдПрдХ рд╣реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧ-рдЗрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд▓рдкреЗрдЯрддреА рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рднреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕реВрдЪрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрд╣рд▓реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд╣рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХрдХреНрд╖рд╛ рдХреЗ рддрд░реАрдХреЛрдВ рдФрд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред GetNewPlugin рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ C ++ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд╛рд╕реНрдХрд▓ рдХреЛрдб рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред
рдкреБрдирд╢реНрдЪ: рдореИрдВ рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ рдХрд┐ рдкрд╛рд╕реНрдХрд▓ рдореЗрдВ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдорд╛рдирддрдГ рдХреЛрд╢рд┐рд╢ / рдХреИрдЪ рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдЗрд╕ рдкреНрд▓рдЧрдЗрди рд╡рд┐рдзрд┐ рдореЗрдВ рдирд╣реАрдВ рдбрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд▓рдЧрдЗрди рдХреЛ рдЕрдкрдиреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдкрд░рд┐рдгрд╛рдо рддреБрд░рдВрдд рдпрд╛ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
PS2: рдирд┐: рд╢реБрд▓реНрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реА рдЧрдИ рдФрд░ рдЗрд╕рдХреЗ рдХреЛрдб рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдФрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ getNewPlugin рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реАред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдЬреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ред
тЖТ
рдирдореВрдирд╛ рд╕реНрд░реЛрдд