Introduction

Have you ever wondered how to develop plug-ins for multiple platforms like Windows and Linux with the same code? Then, you should take a closer look at the Simple Plug-in Layer (SPL) Library!

About this library

The SPL (Simple Plug-in Layer) library is an open source SDK (LGPL license) for plug-in development. With SPL, you can extend any application written in C/C++ to use your own plug-ins, the SPL will do all the managing, loading and unloading stuff for you. Additionally, the whole framework is fully multi-platform capable, so you don't have to develop multiple versions of the same plug-in for platforms provided by SPL.

This library was developed by Andreas Loeffler and René Stuhr. Please visit this site for updates and more useful stuff on SPL.

Various examples for all the platforms explaining the development step by step.

Source code written in uniform style.

Overview

SPL is divided in two parts: Functions / classes for applications that want to use plug-ins, and the plug-in development side. The plug-in development side offers macros that you can use optionally to speed up your plug-in development.

A plug-in consists of four simple C-functions, all of which except one can be implemented as "default-functions" without any code behind it, using SPL's macros:

GetInfo

Initialize

Run (cannot be used as default-function)

Shutdown

What does a "default-function" mean? A default-function is a simple function without any code in it. Since SPL requires these four functions in any case, you can use SPL's macros for implementing it. If you want to use one of these functions in a special way , just don't use the function-macro and implement that function for yourself.

So, why doesn't the Run function have such a macro? Hmmm, well, if we have such a macro, the Run function would be implemented by default with no code, so the plug-in does nothing :-).

Note: If you want to use/compile your plug-in with Windows, you need two additional macros provided by SPL, they're called:

SPL_DEFINE_PLUGIN_EXPORTS();
SPL_DEFINE_PLUGIN_DLLMAIN();

These two macros provide some Windows-specific code which is not used by other platforms like Linux, for example. Don't worry about it, you can put them safely into your plug-in, it does not matter if you want to compile/use your plug-in on Linux platform, SPL does all the stuff internally for you, so you won't have to change anything to compile and use your plug-ins on different platforms!

A "Hello-World" plug-in

Let's start with a very simple "Hello-World" plug-in. This example is also included in the SPL package. Our goal is a simple plug-in that compiles / runs on Windows and Linux, without doing any changes in the source code when "porting" it. Okay, actually you don't have to "port" anything ;-)

That's really all you need in your header file. We already discussed the SPL_DEFINE_PLUGIN_EXPORTS(); macro, so let's go to the macro:

SPL_DEFINE_PLUGIN_INFO();

This macro derives a class from slcPluginInfo, which is responsible for holding plug-in information like name, version, build number, vendor etc., and it creates a global instance called g_pluginInfo. This global object is required for all default-function macros of SPL.

Note for hardcore-coders: You don't need any of SPL's macros to make it working, a simple example on how to implement a plug-in without the macros is included in the SPL package.

Looks very simple, doesn't it? I have not used any "default-function" macros (except for the GetInfo function) here, since I wanted to present how you can use all the functions (again, except GetInfo) on your own.

"Hm, okay, sounds good, but when are these functions called?" I hear you whisper ..that's a good question!

The reason why almost nobody would implement their own version of GetInfo is that this function basically does nothing other than returning a pointer to the plug-in information structure that we filled in the header by using the macro SPL_DEFINE_PLUGIN_INFO().

The Initialize function is called when a plug-in is successfully loaded, GetInfo is called manually from the user's code if he wants to get more information about the plug-in, Run contains the actual plug-in code, Shutdown is either called manually by the user if his program ends or it's done by the SPL's destructor to give all plug-ins a chance to clean themselves up.

Various examples using SPL are included in the SDK, a Doxygen-generated documentation for all parameters and functions is also included. Builds for Microsoft .NET 2003, Microsoft Visual Studio 6.0 and Linux (GCC) are also included.

Screenshot of the MFC example application

This screenshot shows an example application which is included in the SDK:

On the left side: our MFC example application showing all the loaded plug-ins and using the SPL library as DLL build. In the left list view, you see all the loaded plug-ins with the first plug-in selected. In the small window on the right, you see the information of the selected plug-in. You can modify a given text using the selected plug-in(s).

On the right side: the red line marks the example application itself. Beneath the line, you can see all the loaded plug-in processes.

Resources

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

Share

About the Author

I was born in 1982 near Stuttgart / Germany and began my first steps in programming computers at the age of only nine years on an old Commodore CBM 7072. In 2002 I finished my education as IT specialist for software engineering and did my civillian service afterwards. Currently I'm working as leader of the software division in a bigger company located in south west Germany, mainly on software development and research projects for multimedia terminals and user recognition/verification systems.

Comments and Discussions

ive been looking at your documantation and reading the toutorals in the download ive even downlaoded libspl-0.4 and in VS2005 i keep getting abounch of external link errors when i try and call anything from the SPL lib i know that everything is in fact linked togather it compiles with the linker alright but i cant call any thing from your lib to my app is there something im missing

Unfortunately, I did not have the chance to test the library under Visual Studio 2005 yet.
Do you use Visual Studio Express Edition? If so, you'll need an additional SDK called 'Platform SDK' from Microsoft, since these Express Editions do not have native support for C/C++ Windows programming.

I just tested the settings with Visual Studio 2003 and
it worked fine. Maybe you could post me an error dump of the samples which did not compile? If you already got a working solution for using SPL with Visual Studio 2005, I would be happy to integrate it
into the next upcoming release of SPL.

I've come to a lot of those conclusions myself, but microsoft has stopped supporing Platform SDK since the release of dot net 2.0. So I went and made my own plug-in system unfortunately it is not platform independent but hey that's microsoft for you.