Click here to Skip to main content
Click here to Skip to main content
Add your own
alternative version
Go to top

Multi platform plug-in development made easy!

, 7 Mar 2006
How to use and develop plug-ins for multiple platforms.
multi_platform_plugin_spl_demo.zip
obj
builds
dotnet2003
libspl.suo
linux
inst-sh
INSTALL
makefile
vc6
libspl.dsp
libspl.dsw
code
include
source
documents
bin
release
DocuSPL.chm
html
classSPL_1_1slaPluginServer.png
classSPL_1_1slaPluginServer__coll__graph.map
classSPL_1_1slaPluginServer__coll__graph.md5
classSPL_1_1slaPluginServer__coll__graph.png
classSPL_1_1slaPluginServer__inherit__graph.map
classSPL_1_1slaPluginServer__inherit__graph.md5
classSPL_1_1slaPluginServer__inherit__graph.png
classSPL_1_1slcMutex__inherit__graph.map
classSPL_1_1slcMutex__inherit__graph.md5
classSPL_1_1slcMutex__inherit__graph.png
classSPL_1_1slcPluginArgs.png
classSPL_1_1slcPluginArgs__coll__graph.map
classSPL_1_1slcPluginArgs__coll__graph.md5
classSPL_1_1slcPluginArgs__coll__graph.png
classSPL_1_1slcPluginArgs__inherit__graph.map
classSPL_1_1slcPluginArgs__inherit__graph.md5
classSPL_1_1slcPluginArgs__inherit__graph.png
classSPL_1_1slcPluginInfo.png
classSPL_1_1slcPluginInfo__coll__graph.map
classSPL_1_1slcPluginInfo__coll__graph.md5
classSPL_1_1slcPluginInfo__coll__graph.png
classSPL_1_1slcPluginInfo__inherit__graph.map
classSPL_1_1slcPluginInfo__inherit__graph.md5
classSPL_1_1slcPluginInfo__inherit__graph.png
classSPL_1_1slcPluginServer.png
classSPL_1_1slcPluginServer_a10_cgraph.map
classSPL_1_1slcPluginServer_a10_cgraph.md5
classSPL_1_1slcPluginServer_a10_cgraph.png
classSPL_1_1slcPluginServer_a1_cgraph.map
classSPL_1_1slcPluginServer_a1_cgraph.md5
classSPL_1_1slcPluginServer_a1_cgraph.png
classSPL_1_1slcPluginServer_a7_cgraph.map
classSPL_1_1slcPluginServer_a7_cgraph.md5
classSPL_1_1slcPluginServer_a7_cgraph.png
classSPL_1_1slcPluginServer_a9_cgraph.map
classSPL_1_1slcPluginServer_a9_cgraph.md5
classSPL_1_1slcPluginServer_a9_cgraph.png
classSPL_1_1slcPluginServer__coll__graph.map
classSPL_1_1slcPluginServer__coll__graph.md5
classSPL_1_1slcPluginServer__coll__graph.png
classSPL_1_1slcPluginServer__inherit__graph.map
classSPL_1_1slcPluginServer__inherit__graph.md5
classSPL_1_1slcPluginServer__inherit__graph.png
classSPL_1_1slcThread.png
classSPL_1_1slcThreadLock_a0_cgraph.map
classSPL_1_1slcThreadLock_a0_cgraph.md5
classSPL_1_1slcThreadLock_a0_cgraph.png
classSPL_1_1slcThreadLock_a1_cgraph.map
classSPL_1_1slcThreadLock_a1_cgraph.md5
classSPL_1_1slcThreadLock_a1_cgraph.png
classSPL_1_1slcThreadLock_a2_cgraph.map
classSPL_1_1slcThreadLock_a2_cgraph.md5
classSPL_1_1slcThreadLock_a2_cgraph.png
classSPL_1_1slcThreadLock_a3_cgraph.map
classSPL_1_1slcThreadLock_a3_cgraph.md5
classSPL_1_1slcThreadLock_a3_cgraph.png
classSPL_1_1slcThreadLock_a4_cgraph.map
classSPL_1_1slcThreadLock_a4_cgraph.md5
classSPL_1_1slcThreadLock_a4_cgraph.png
classSPL_1_1slcThreadLock__coll__graph.map
classSPL_1_1slcThreadLock__coll__graph.md5
classSPL_1_1slcThreadLock__coll__graph.png
classSPL_1_1slcThread__inherit__graph.map
classSPL_1_1slcThread__inherit__graph.md5
classSPL_1_1slcThread__inherit__graph.png
doxygen.png
graph_legend.dot
graph_legend.png
index.hhc
index.hhk
index.hhp
inherit__graph__0.map
inherit__graph__0.md5
inherit__graph__0.png
inherit__graph__1.map
inherit__graph__1.md5
inherit__graph__1.png
spl_8h__incl.map
spl_8h__incl.md5
spl_8h__incl.png
spl__mutex_8cpp__incl.map
spl__mutex_8cpp__incl.md5
spl__mutex_8cpp__incl.png
spl__mutex_8h__dep__incl.map
spl__mutex_8h__dep__incl.md5
spl__mutex_8h__dep__incl.png
spl__mutex_8h__incl.map
spl__mutex_8h__incl.md5
spl__mutex_8h__incl.png
spl__platform_8h__dep__incl.map
spl__platform_8h__dep__incl.md5
spl__platform_8h__dep__incl.png
spl__pluginargs_8cpp__incl.map
spl__pluginargs_8cpp__incl.md5
spl__pluginargs_8cpp__incl.png
spl__pluginargs_8h__dep__incl.map
spl__pluginargs_8h__dep__incl.md5
spl__pluginargs_8h__dep__incl.png
spl__pluginargs_8h__incl.map
spl__pluginargs_8h__incl.md5
spl__pluginargs_8h__incl.png
spl__plugininfo_8cpp__incl.map
spl__plugininfo_8cpp__incl.md5
spl__plugininfo_8cpp__incl.png
spl__plugininfo_8h__dep__incl.map
spl__plugininfo_8h__dep__incl.md5
spl__plugininfo_8h__dep__incl.png
spl__plugininfo_8h__incl.map
spl__plugininfo_8h__incl.md5
spl__plugininfo_8h__incl.png
spl__pluginserver_8cpp__incl.map
spl__pluginserver_8cpp__incl.md5
spl__pluginserver_8cpp__incl.png
spl__pluginserver_8h__dep__incl.map
spl__pluginserver_8h__dep__incl.md5
spl__pluginserver_8h__dep__incl.png
spl__pluginserver_8h__incl.map
spl__pluginserver_8h__incl.md5
spl__pluginserver_8h__incl.png
spl__pluginserver__linux_8cpp__incl.map
spl__pluginserver__linux_8cpp__incl.md5
spl__pluginserver__linux_8cpp__incl.png
spl__pluginserver__linux_8h__dep__incl.map
spl__pluginserver__linux_8h__dep__incl.md5
spl__pluginserver__linux_8h__dep__incl.png
spl__pluginserver__linux_8h__incl.map
spl__pluginserver__linux_8h__incl.md5
spl__pluginserver__linux_8h__incl.png
spl__pluginserver__win32_8cpp__incl.map
spl__pluginserver__win32_8cpp__incl.md5
spl__pluginserver__win32_8cpp__incl.png
spl__pluginserver__win32_8h__dep__incl.map
spl__pluginserver__win32_8h__dep__incl.md5
spl__pluginserver__win32_8h__dep__incl.png
spl__pluginserver__win32_8h__incl.map
spl__pluginserver__win32_8h__incl.md5
spl__pluginserver__win32_8h__incl.png
spl__threadlock_8cpp__incl.map
spl__threadlock_8cpp__incl.md5
spl__threadlock_8cpp__incl.png
spl__threadlock_8h__dep__incl.map
spl__threadlock_8h__dep__incl.md5
spl__threadlock_8h__dep__incl.png
spl__threadlock_8h__incl.map
spl__threadlock_8h__incl.md5
spl__threadlock_8h__incl.png
spl__thread_8cpp__incl.map
spl__thread_8cpp__incl.md5
spl__thread_8cpp__incl.png
spl__thread_8h__dep__incl.map
spl__thread_8h__dep__incl.md5
spl__thread_8h__dep__incl.png
spl__typedefs_8h__dep__incl.map
spl__typedefs_8h__dep__incl.md5
spl__typedefs_8h__dep__incl.png
spl__typedefs_8h__incl.map
spl__typedefs_8h__incl.md5
spl__typedefs_8h__incl.png
spl.dox
examples
bin
ConsoleTest.exe
MfcPluginDllTest.exe
MFCPluginTest.exe
MfcThreadPluginTest.exe
spl.dll
builds
ConsoleTest
makefile
MfcPluginDllTest
res
MfcPluginDllTest.ico
MfcPluginTest
res
mfcplugintest.ico
MfcThreadPluginTest
res
MfcThreadPluginTest.ico
plArgInfos
makefile
plHelloWorld
makefile
plHelloWorldNoMacros
makefile
plReverse
makefile
plReverseSlow
makefile
plToLower
makefile
plToUpper
makefile
obj
plugins
plArgInfos.dll
plHelloWorld.dll
plHelloWorldNoMacros.dll
plReverse.dll
plReverseSlow.dll
plToLower.dll
plToUpper.dll
lib
dll
spl.dll
spl.lib
spld.dll
spld.lib
libspl.lib
libspld.lib
/*!

\section terms_of_use Terms of Use

libspl - the simple plugin layer library.
Copyright (C) 2004 Andreas Loeffler and Ren� Stuhr (www.unitedbytes.de).

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

\section author Author
Andreas Loeffler (www.unitedbytes.de)

*/

#include "plReverseSlow.h"

//
// Define a standard DllMain() function for Win32 plugin DLLs.
// Note: You haven't to delete or comment out this function for other platforms.
// SPL automatically detects the current platform and removes unused/unwanted code
// behind the macros.
//
SPL_DEFINE_PLUGIN_DLLMAIN();

//
// Define the default splGetInfo() function.
// Usually you won't have to modify this function.
//
SPL_IMPLEMENT_PLUGIN_GETINFO();

//
// Define the default splInitialize() function.
// This is only a simple example plugin, so we don't need
// a self-implemented initialisation function in here.
//
SPL_IMPLEMENT_PLUGIN_INITIALIZE();

//
// Define the default splShutdown() function.
// This is only a simple example plugin, so we don't need
// a self-implemented shutdown function in here.
//
SPL_IMPLEMENT_PLUGIN_SHUTDOWN();

//
// Wow, that was really hard, wasn't it?
// Now we have all needed functions implemented by SPL except the splRun function.
// Since it doesn't make any sense to implement a default splRun function too, we 
// have to do this manually.
//
SPL_PLUGIN_API bool SPL_RUN_NAME_CODE( slcPluginArgs* a_pPluginArgs )
{
	//
	// Did the host program gave this plugin arguments?
	// If not, this plugin will fail!
	//
	if( NULL == a_pPluginArgs )
		return false;

	//
	// We need exactly 2 parameters (arguments):
	// The first parameter is a string which holds a text which will be manipulated with this plugin.
	// The second parameter represents a pointer to a buffer for the result.
	//
	if( a_pPluginArgs->GetCount() != 2 )
		return false; 

	//
	// Create pointer to save the arguments.
	//
	char* pcText[ 1 ];
	char* pcResult[ 1 ];

	//
	// Save the arguments.
	//
	a_pPluginArgs->GetArg( 0, pcText );
	a_pPluginArgs->GetArg( 1, pcResult );

	if( ( NULL == pcText ) ||
		( NULL == pcResult ) )
	{
		return false;
	}

	//
	// Get text length from first parameter.
	//
	long lLen = ( long )strlen( *pcText );

	//
	// Clear destination buffer with 0 (includes string termination byte \0).
	//
	memset( *pcResult, 0, lLen + 1 );

	//
	// Create help pointer to incrase/decrase adresses.
	// The dereferenced pointers *pcResult and *pcText couldnt be increased/decreased (has a static address).
	//
	char* cPtrResult = *pcResult;
	char* cPtrText	 = *pcText;

	//
	// Set result offset to end of string.
	//
	cPtrResult += lLen - 1;

	for( int i=0; i < lLen; i++)
	{
		//
		// Check if a new line "\r\n" is detected, don't reverse it.
		//
		if( *cPtrText == '\r' )
		{
			*cPtrResult-- = '\n';
			*cPtrResult-- = '\r';
			i++;
			continue;
		}
		*cPtrResult-- = *cPtrText++;

#if SPL_PLATFORM == SPL_PLATFORM_WIN32

		Sleep( 100 );

#elif SPL_PLATFORM == SPL_PLATFORM_LINUX

		struct timespec t;
		SPL_BITTYPE_64 i64NanoSecs = ( SPL_BITTYPE_64 )( 1 * 10000000.0 );
		t.tv_sec  = i64NanoSecs / 1000000000;
		t.tv_nsec = i64NanoSecs % 1000000000;
		nanosleep( &t, NULL );

#endif
	} 
	return true;
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

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.

A list of licenses authors might use can be found here

Share

About the Author

Andreas Loeffler
Web Developer
Germany Germany
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.

| Advertise | Privacy | Mobile
Web01 | 2.8.140926.1 | Last Updated 7 Mar 2006
Article Copyright 2004 by Andreas Loeffler
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid