ºìÁªLinuxÃÅ»§
Linux°ïÖú

Linuxϲå¼þ¿ª·¢Ó¦Óð¸Àý

·¢²¼Ê±¼ä:2006-02-22 00:36:00À´Ô´:ºìÁª×÷Õß:ºÎ¸ç
¡¡¡¡ ÔÚLinux ÉÏÓúÀ´Óú¶àµÄÓ¦ÓóÌÐòÀûÓÃPlugin±à³Ì¼¼ÊõÀ´ÊµÏÖÀ©Õ¹¹¦ÄÜ£¬Ä¿Ç°Ó¦ÓñȽϹ㷺µÄÓÐGimp¡¢Netscape/Mozilla¡¢XMMSºÍNessusµÈ£¬±¾ÎĽ«¼òµ¥½éÉÜÕâЩÈí¼þµÄPluginµÄ¼Ü¹¹ºÍ±à³Ì¡£


¡¡¡¡ ¸øÈí¼þÒÔÉúÃüÁ¦µÄPlugin


¡¡¡¡ ÖÚËùÖÜÖª£¬ÒªÈÃÒ»¸öÈí¼þ¾ßÓÐÉúÃüÁ¦£¬×îÖØÒªµÄÒ»µãÊÇÒªÈÃËüÌṩ²¢Ö§³ÖÔ½À´Ô½¶àµÄ¹¦ÄÜ£¬¶øÕâÒ»µãµ¥Æ¾¿ª·¢Õß×ÔÉíÊǺÜÄѶÀÁ¢×öµ½µÄ£¬ÐèÒªÈõÚÈý·½µÄÈí¼þ¿ª·¢Õß¿ÉÒÔͨ¹ý×÷ÕßÌṩµÄÒ»ÖÖ;¾¶À´Îª¸ÃÈí¼þÌí¼Ó¹¦ÄÜ¡£

¡¡¡¡ ×î³õ£¬ÈËÃÇÊÇʹÓùØÁªÄ£Ê½£¬Ò²¾ÍÊÇÏñWindowsϵÄÎļþÀ©Õ¹ÃûÒ»Ñù£¬¸ù¾Ý²»Í¬µÄÎļþ¹ØÁª£¬Ê¹Óò»Í¬µÄÈí¼þ´ò¿ªÏàÓ¦µÄÎļþ¡£ÕâÖÖ·½Ê½±àдÀ©Õ¹×îΪÈÝÒ׺Í×ÔÓÉ£¬µ«ÊÇ´æÔÚÒ»¶¨µÄȱÏÝ£¬Ê×ÏÈÊDz»ÄÜÀûÓÃËÞÖ÷Èí¼þµÄ×ÊÔ´£¬Æä´ÎÊÇÈí¼þµÄ½çÃæ·ç¸ñ²»Ò×ͳһ¡¢Áé»îÐÔ²»ºÃ¡£ºóÀ´³öÏÖÁËPlugin½á¹¹£¬Ò²¾ÍÊÇÀûÓö¯Ì¬Á¬½Ó¿âµÄ·½Ê½ÖÆ×÷Plugin£¨ÔÚWindowsƽ̨ÏÂÊÇDLL¡¢ÔÚLinux/Unix»·¾³ÏÂÊÇshare object library£©£¬Plugin³ÌÐòÖ»ÄÜÒÀ¸½ÓÚËÞÖ÷³ÌÐòÔËÐУ¬²»ÄܶÀÁ¢ÔËÐУ¬Ê¹ÓÃPluginµÄÓŵãÊÇϵͳ¿ªÏúС¡¢Ëٶȿ죬ͬËÞÖ÷³ÌÐò½áºÏ½ôÃÜ¡¢Áé»îÐԺá£
¡¡¡¡ ÔÚLinuxÉÏ£¬×îÖøÃûµÄPlugin¼Ü¹¹¾ÍÊÇNetscapeÌá³öµÄPlugin¼Ü¹¹£¬±È½Ï³öÃûµÄ»¹ÓÐWinAmp£¨www.winamp.com£©£¨ÔÚLinux ÉϸÄÃû½ÐXMMS,ÍøַΪwww.xmms.org£©£¬Õâ¸öMP3 ²¥·ÅÈí¼þÖжà²Ê¶à×˵IJå¼þ£¨Plugin£©ÏµÍ³ºÍƤ·ô£¨skin£©ÏµÍ³ÎªÆäһͳÌìÏÂ×ö³öÁ˲»¿ÉÄ¥ÃðµÄ¹±Ïס£ÏÖÔÚWinAmpÒÑ¿ªÊ¼Ìṩһ¸öNSDN£¨Null Soft Develop Network£©À´Èôó¼Ò¿ª·¢Plugin£¬Óɴ˿ɼûPlugin¶ÔÓÚÒ»¸öÈí¼þÀ´ËµÊǶàôÖØÒª¡£


¡¡¡¡ Linuxϲå¼þ°²×°


¡¡¡¡ ÔÚLinuxÉÏ£¬Ê¹ÓÃijÖÖÈí¼þµÄPluginµÄ·½·¨ºÜ¼òµ¥£¬Ò»°ã¸ÃËÞÖ÷Èí¼þ¶¼»áÌṩһЩȱʡµÄPlugin£¬¶øÇÒ»áËÑÑ°ÏàÓ¦µÄPluginĿ¼£¬Óû§¿ÉÒÔ°ÑPlugin°²×°µ½ÏµÍ³µÄPluginĿ¼ÏÂÒ²¿ÉÒÔ°²×°µ½×Ô¼ºµÄĿ¼Ï¡£±ÈÈ磬Ҫ°²×°NetscapeµÄPlugin£¬¿ÉÒÔÉ趨$NPX_PLUGIN_PATHÕâ¸ö»·¾³±äÁ¿µ½ÄãµÄÐÂPluginĿ¼£¬»òÕß°ÑPlugin°²×°µ½ÏÂÁз¾¶ÉÏ£º

¡¡¡¡
ÒýÓÃ:
/usr/local/lib/netscape/Plugins

¡¡¡¡ $MOZILLA_HOME/Plugins

¡¡¡¡ $HOME/.netscape/Plugins


¡¡¡¡ Netscape»á×Ô¶¯ËÑÑ°ÕâЩPluginĿ¼À´×Ô¶¯¼ÓÔØÏàÓ¦µÄPlugin£¬ÆäËûµÄÈí¼þÈçGimp¡¢ XMMSºÍNessusµÈµÄʹÓ÷½·¨Óë´Ë´óͬСÒì¡£


¡¡¡¡ ×î¼òµ¥Plugin¼Ü¹¹µÄʵÏÖ


¡¡¡¡ Ê×ÏÈ£¬ÎÒÃÇÒª±àдһ¸öËÞÖ÷³ÌÐò£¬¸ÃËÞÖ÷³ÌÐò±ØÐëΪPluginÌṩÏàÓ¦µÄ½Ó¿Ú£¬ÀýÈçÔÚ±¾Àý×ÓÖеÄAction£¬È»ºóËÞÖ÷³ÌÐò¿ÉÒÔͨ¹ýdlopenÀ´´ò¿ªÏàÓ¦µÄPlugin£¬µ÷ÓÃdlsym ºÍcreateprocÀ´´´½¨PluginµÄ½ø³Ì£¬×îºó»¹Òªµ÷ÓÃPluginÖ´ÐÐÏàÓ¦µÄ¶¯×÷£¬Ò»ÇÐÍê³ÉºóÒªÓÃdlclose À´¹Ø±ÕPlugin¡£ËÞÖ÷³ÌÐòµÄÔ´´úÂëÈçÏ£º

¡¡¡¡
ÒýÓÃ:
Plugin£ßmain£®h

¡¡¡¡ #ifndef _PLUG_MAIN_H_

¡¡¡¡ #define _PLUG_MAIN_H_

¡¡¡¡ // ¶¨ÒåÇ¿ÖÆCÀàÐÍÒԻرÜC++ÃüÃû¹æ·¶,ÕâÑùÎÒÃǾͿÉÒÔ¶¨Òådlsym()

¡¡¡¡ #ifdef __cplusplus

¡¡¡¡ extern "C" {

¡¡¡¡ #endif

¡¡¡¡ class CPlugMain

¡¡¡¡ {

¡¡¡¡ public:

¡¡¡¡ virtual int Action() = 0;

¡¡¡¡ };

¡¡¡¡ // ÏÂÃæÊÇPluginµÄͨÓú¯Êý,ÿ¸öPlugin¶¼»áÖØÔØÕâ¸öº¯Êý,Ö÷³ÌÐò½«´´½¨Î©Ò»µÄ×Ó½ø³Ì

¡¡¡¡ extern CPlugMain ?CreatePlug();

¡¡¡¡ typedef CPlugMain ? (?CREATEPLUG_PROC)();
¡¡¡¡ #ifdef __cplusplus

¡¡¡¡ }

¡¡¡¡ #endif //#define cplusplus

¡¡¡¡ #endif //#define _PLUG_MAIN_H_

¡¡¡¡ ????????????????????????????????????????????????????

¡¡¡¡ Plugin£ßmain£®cpp

¡¡¡¡ #include "Plugin_main.h"

¡¡¡¡ #include £¼stdio.h£¾

¡¡¡¡ #include £¼dlfcn.h£¾ //¶¯Ì¬Á´½Ó¿âÏà¹Øº¯Êý

¡¡¡¡ //ÏÂÃ潫¶¨Òå¹Ì¶¨µÄPluginÃû³Æ,¶ÁÕß¿ÉÒÔ×ÔÐж¨ÒåÈçͬWindows×¢²á±íÄÇÑùµÄPlugin×¢²áϵͳ

¡¡¡¡ #define NUM_PLUGINS 2

¡¡¡¡ char ? szPlugins[] =
¡¡¡¡ {

¡¡¡¡ "./Plugin1.so",

¡¡¡¡ "./Plugin2.so"

¡¡¡¡ };

¡¡¡¡ int main( int argc, char ?? argv )

¡¡¡¡ {

¡¡¡¡ CREATEPLUG_PROC createproc[NUM_PLUGINS];

¡¡¡¡ CPlugMain ? pPlugins[NUM_PLUGINS];

¡¡¡¡ void ? handle[NUM_PLUGINS];

¡¡¡¡ char ? error;

¡¡¡¡ int i;

¡¡¡¡ // ¼ÓÔØËùÓÐPlugin

¡¡¡¡ for ( i=0; i£¼NUM_PLUGINS; i++ )

¡¡¡¡ {

¡¡¡¡ printf( "¼ÓÔØPlugin %s.\n", szPlugins[i] );

¡¡¡¡ // ¼ÓÔØPlugin¶¯Ì¬Á´½Ó¿â

¡¡¡¡ if (NULL == (handle[i] = dlopen( szPlugins[i], RTLD_LAZY )))

¡¡¡¡ {

¡¡¡¡ handle[i] = NULL;

¡¡¡¡ printf( "dlopen error (%s)\n", szPlugins[i] );

¡¡¡¡ }

¡¡¡¡ else

¡¡¡¡ {

¡¡¡¡ // È¡µÃCreatePlugµÄµØÖ·

¡¡¡¡ createproc[i] = (CREATEPLUG_PROC)dlsym( handle[i], "CreatePlug" );

¡¡¡¡ if ((error = dlerror()) != NULL)

¡¡¡¡ {

¡¡¡¡ dlclose( handle[i] );

¡¡¡¡ handle[i] = NULL;

¡¡¡¡ printf( "dlsym error (%s)\n", szPlugins[i] );

¡¡¡¡ }

¡¡¡¡ else

¡¡¡¡ {

¡¡¡¡ // ´´½¨Plugin½ø³Ì

¡¡¡¡ pPlugins[i] = createproc[i]();

¡¡¡¡ }

¡¡¡¡ }

¡¡¡¡ }

¡¡¡¡ // Ö´ÐÐPluginµÄ¶¯×÷

¡¡¡¡ printf( "ÕýÔÚÔËÐÐPlugin ..\n" );

¡¡¡¡ for ( i=0; i£¼NUM_PLUGINS; i++ )

¡¡¡¡ {

¡¡¡¡ if (handle[i] != NULL)

¡¡¡¡ {

¡¡¡¡ pPlugins[i]-£¾Action();
¡¡¡¡ }

¡¡¡¡ }

¡¡¡¡ // ¹Ø±ÕPlugin

¡¡¡¡ for ( i=0; i£¼NUM_PLUGINS; i++ )

¡¡¡¡ {

¡¡¡¡ if (handle[i] != NULL)

¡¡¡¡ {

¡¡¡¡ dlclose( handle[i] );

¡¡¡¡ handle[i] = NULL;

¡¡¡¡ }

¡¡¡¡ }

¡¡¡¡ return 0;

¡¡¡¡ }


¡¡¡¡ ????????????????????????????????????????????????????

¡¡¡¡ ÏÂÃæÊÇÒ»¸ö×î¼òµ¥µÄPlugin£¬Ö»°üº¬ÁËPlugin_main.h Õâ¸öÍ·Îļþ£¬²¢ÇÒʵÏÖActionºÍCreatePlugÕâÁ½¸öº¯Êý¡£Ô´³ÌÐòÈçÏ£º

¡¡¡¡
ÒýÓÃ:
Plugin£ß1£®h

¡¡¡¡ ££ifndef £ßPLUGIN£ß1£ßH£ß

¡¡¡¡ ££define £ßPLUGIN£ß1£ßH£ß

¡¡¡¡ ££include ¡åPlugin£ßmain£®h¡å

¡¡¡¡ class CPlugin1 ? public CPlugMain

¡¡¡¡ ?

¡¡¡¡ public?

¡¡¡¡ virtual int Action???

¡¡¡¡ ??

¡¡¡¡ ££endif £¯£¯£££ä£å£æ£é£î£å £ßPLUGIN£ß1£ßH£ß



¡¡¡¡ Plugin£ß1£®cpp



¡¡¡¡ ££include ¡åPlugin£ßmain£®h¡å

¡¡¡¡ ££include ¡åPlugin1£®h¡å

¡¡¡¡ ££include £¼stdio£®h£¾

¡¡¡¡ int CPlugin1??Action??

¡¡¡¡ ?

¡¡¡¡ printf( "ÕâÊÇPlugin 1,ÔËÐÐÕý³£\n" );

¡¡¡¡ return 0;

¡¡¡¡ }



¡¡¡¡ CPlugMain ? CreatePlug()

¡¡¡¡ {

¡¡¡¡ return new CPlugin1;

¡¡¡¡ }

¡¡¡¡ }


¡¡¡¡ ????????????????????????????????????????????????????

¡¡¡¡ ÖµµÃ×¢ÒâµÄÊÇ£¬±àÒëÕâ¸öPluginµÄʱºòҪʹÓà -shared²ÎÊýÀ´²úÉú¶¯Ì¬Á´½Ó¿â.soÎļþ£¬ÀýÈ磺gcc -o Plugin1.so Plugin1.o -shared¡£


¡¡¡¡ Plugin¿ª·¢ÊµÕ½


¡¡¡¡ ÎÒÃÇÀ´¿´¿´ÈçºÎΪÏÖÓеÄһЩÈí¼þ±àдPlugin£¬ÆäÖÐ×ÔÓµÄÊÇNetscape 4.x ºÍMozilla £¨Netscape 6.x£©µÄPlugin±àд¹¤×÷£¬¶øXmms/Gimp/NessusµÄPluginÏà¶ÔÀ´ËµÒªÈÝÒ×±àдµÃ¶à¡£

¡¡¡¡ 1£® Netscape 4£®x / Mozilla µÄPlugin½á¹¹

¡¡¡¡ NetscapeµÄPlugin½á¹¹Ïà¶Ô±È½Ï¹ÅÀÏ£¬NetscapeÌṩµÄ½Ó¿Ú°üÀ¨NPP ϵÁкÍNPN ϵÁУ¬ÆäÖÐNPP ϵÁÐÖÐPlugin±ØÐë×ÔÐÐʵÏÖ£¬°üÀ¨£ºNPP_Destroy¡¢NPP_DestroyStream¡¢

¡¡¡¡ NPP_GetJavaClass¡¢NPP_HandleEvent¡¢NPP_Initialize¡¢NPP_New¡¢NPP_NewStream¡¢NPP_Print¡¢NPP_SetWindow¡¢NPP_Shutdown¡¢NPP_StreamAsFile¡¢NPP_URLNotify¡¢NPP_WriteºÍNPP_WriteReady¡£

¡¡¡¡ NPN ϵÁÐÊÇPluginÒªÇóNetscapeÌṩµÄһЩº¯Êý£¬°üÀ¨£ºNPN_DestroyStream¡¢
¡¡¡¡ NPN_GetJavaEnv¡¢NPN_GetJavaPeer¡¢NPN_GetURL¡¢

¡¡¡¡ NPN_MemAlloc¡¢NPN_MemFlush¡¢NPN_MemFree¡¢

¡¡¡¡ NPN_NewStream¡¢NPN_PostURL¡¢NPN_RequestRead¡¢

¡¡¡¡ NPN_Status¡¢NPN_UserAgent¡¢NPN_VersionºÍNPN_Write¡£

¡¡¡¡ ÿÖÖPlugin¶¼ÓÐÁ½ÖÖ¹¤×÷ģʽ£¬¼´Ç¶ÈëʽºÍÈ«Ò³Ã淽ʽ£¬PluginÐèҪʵÏֵŤ×÷°üÀ¨ÒÔÏÂÄÚÈÝ£º

¡¡¡¡ £¨1£©µÇ¼ÇÒ»ÖÖ»ò¼¸ÖÖPluginÒª²Ù×÷µÄMIME¸ñʽ£»

¡¡¡¡ £¨2£©ÔÚä¯ÀÀÆ÷µÄ´°¿ÚÖмä»æͼ£»

¡¡¡¡ £¨3£©½ÓÊÕÊó±ê/¼üÅÌÊäÈ룻

¡¡¡¡ £¨4£©´ÓÏàÓ¦µÄURLÖÐÏÂÔØ/·¢ËÍÊý¾Ý¡£

¡¡¡¡ Óû§Èç¹ûÒª¿ª·¢NetscapeµÄPlugin£¬Ê×ÏÈÒªÔÚftp://ftp.netscape.com/pub/sdk/Plugin/unix

¡¡¡¡ ÏÂÔØÏàÓ¦µÄSDK Îļþ£¬ÀïÃæÓмòµ¥µÄÀý×Ó£¬Óû§¿ÉÒÔ×ÔÐÐÐ޸ijÉ×Ô¼ºµÄPlugin¡£

¡¡¡¡ Mozilla/Netscape 6.xµÄPlugin¼Ü¹¹ÊÇÄ¿Ç°×îÏȽøµÄÒ»ÖÖ£¬ËüÖ÷ÒªÓÐÏÂÁÐÓŵ㣺

¡¡¡¡ £¨1£©Ìṩ»ùÓÚC++µÄAPIº¯Êý£»

¡¡¡¡ £¨2£©ÌṩÁËXPCOM£¬ËüÊÇCOM £¨the Component Object Model£©µÄÒ»¸ö×Ó¼¯£¬XPµÄÒâ˼ÊÇcross-platform£¨¿çƽ̨£©£¬ÕâʹµÃеÄPluginµÄ¿çƽ̨ÐԺͲ»Í¬°æ±¾µÄ¼æÈÝÐԵõ½Á˼«´óµÄÌá¸ß£»

¡¡¡¡ £¨3£©ÍêÈ«Ïòºó¼æÈÝ£¬ËùÓÐÀϵÄ4.x ϵÁеÄNetscape Plugin ¶¼¿ÉÒÔ¼ÌÐøʹÓá£

¡¡¡¡ Mozilla µÄPlugin¼Ü¹¹½«Ô­À´µÄNPP ϵÁнӿڸıäΪ£ºNPIPlugin¡¢ NPIPluginInstanceºÍNPIPluginStream Èý¸öÀࣻNPN ϵÁнӿڱ»À©³äΪNPIPluginManager¡¢NPIPluginManagerStream¡¢NPIPluginInstancePeerºÍNPIPluginStreamPeer

¡¡¡¡ ËĸöÀ࣬ÆäÖÐNPµÄÒâ˼ÊÇNetscape Plugin£¬ IµÄÒâ˼ÊÇInterface¡£

linux²å¼þ¿ª·¢²Î¿¼ÎÄÏ× xmms²å¼þ¿ª·¢Ö¸ÄÏ£º http://www.xmms.org

gimp²å¼þ¿ª·¢Ö¸ÄÏ£º http://www.gimp.org/plugin_devel.html

nessus²å¼þ¿ª·¢Ö¸ÄÏ£º http://www.nessus.org/doc/plugins_api.txt

http://www.nessus.org/doc/nasl.html

netscape 4£®x ϵÁвå¼þ¿ª·¢Ö¸ÄÏ£º

http://developer.netscape.com/docs/manuals/
communicator/plugin/index.htm

ftp://ftp.netscape.com/pub/sdk/plugin/unix

mozilla ?netscape 6£®x?ϵÁвå¼þ¿ª·¢Ö¸ÄÏ£º ¡¡
http://www.doczilla.com/development/extmoz.html

http://www.mozilla.org/docs/plugin.html

http://www.mozilla.org/docs/extendmoz.html


¡¡¡¡ Òª¿ª·¢Mozilla µÄPlugin£¬Óû§ÐèÒªÏÂÔØMozilla µÄÔ´´úÂ룬¶øPluginµÄÀý×Ó³ÌÐò¿ÉÒÔÔÚhttp://lxr.mozilla.org/mozilla/source/

¡¡¡¡ Plugin/ ÉϲéÔÄ£¬¾ßÌåÎĵµÇë²ÎÔĸ½Â¼¡£

¡¡¡¡ 2£® XmmsµÄPlugin¼Ü¹¹

¡¡¡¡ XmmsµÄPlugin·ÖΪÊäÈ루Input £©¡¢Êä³ö£¨Output£©¡¢¿ÉÊÓ»¯£¨Visualization£©¡¢Í¨Óã¨General£©¡¢Ð§¹û£¨Effect£©ºÍÆäËû£¨Misc£©ÎåÖÖ£¬Òª¿ª·¢XmmsµÄPluginÐèÒª°²×°xmms-develÕâ¸öÈí¼þ°ü£¬ÏÂÃæÊÇÒ»¸ö×î¼òµ¥µÄXmms¿ÉÊÓ»¯µÄPlugin£º
¡¡¡¡
ÒýÓÃ:
xmms£­Plugin£®c

¡¡¡¡ #include £¼gtk/gtk.h£¾

¡¡¡¡ #include "xmms/Plugin.h"

¡¡¡¡ static GtkWidget ?window = NULL,?button;

¡¡¡¡ static void Plugin_init(void);

¡¡¡¡ static void Plugin_cleanup(void);

¡¡¡¡ VisPlugin Plugin_vp =

¡¡¡¡ {

¡¡¡¡ NULL,

¡¡¡¡ NULL,

¡¡¡¡ 0,

¡¡¡¡ NULL, /? ÃèÊöº¯Êý ?/

¡¡¡¡ 0,

¡¡¡¡ 1,

¡¡¡¡ Plugin_init, /? ³õʼ»¯º¯Êý ?/

¡¡¡¡ Plugin_cleanup, /? ½áÊøº¯Êý ?/

¡¡¡¡ NULL, /? ¹ØÓÚº¯Êý ?/

¡¡¡¡ NULL, /? ÅäÖú¯Êý ?/

¡¡¡¡ NULL, /? disable_Plugin ?/

¡¡¡¡ NULL, /? playback_start ?/

¡¡¡¡ NULL, /? playback_stop ?/

¡¡¡¡ NULL, /? render_pcm ?/

¡¡¡¡ NULL /? render_freq ?/

¡¡¡¡ };

¡¡¡¡ VisPlugin ?get_vPlugin_info(void)

¡¡¡¡ {

¡¡¡¡ Plugin_vp.description =

¡¡¡¡ g_strdup_printf("Hello World!");

¡¡¡¡ return &&Plugin_vp;

¡¡¡¡ }

¡¡¡¡ #define WIDTH 250

¡¡¡¡ #define HEIGHT 100

¡¡¡¡ static void Plugin_destroy_cb(GtkWidget ?w,gpointer data)

¡¡¡¡ {

¡¡¡¡ Plugin_vp.disable_Plugin(&&Plugin_vp);

¡¡¡¡ }

¡¡¡¡ static void Plugin_init(void)

¡¡¡¡ {

¡¡¡¡ if(window)

¡¡¡¡ return;

¡¡¡¡ window = gtk_window_new(GTK_WINDOW_DIALOG);

¡¡¡¡ gtk_window_set_title(GTK_WINDOW(window),"Hello World");

¡¡¡¡ gtk_window_set_policy(GTK_WINDOW(window), FALSE, FALSE, FALSE);

¡¡¡¡ gtk_widget_realize(window);

¡¡¡¡ gtk_widget_set_usize(window, WIDTH, HEIGHT);

¡¡¡¡ button = gtk_button_new_with_label ("Hello World");

¡¡¡¡ gtk_container_add (GTK_CONTAINER (window), button);

¡¡¡¡ gtk_widget_show(button);

¡¡¡¡ gtk_widget_show(window);

¡¡¡¡ }

¡¡¡¡ static void Plugin_cleanup(void)

¡¡¡¡ ?

¡¡¡¡ if (window)
¡¡¡¡ {

¡¡¡¡ gtk£ßwidget£ßdestroy?window??

¡¡¡¡ }

¡¡¡¡ }


¡¡¡¡ 3£® GimpµÄPlugin¼Ü¹¹

¡¡¡¡ GimpµÄPlugin½á¹¹±È½ÏÌØÊ⣬ʹÓÃÁ˺궨ÒåÀ´ÊµÏÖPlugin½Ó¿Ú¡£

¡¡¡¡ MAIN()ºêµ÷ÓÃgimp_main¡¢Ê¹µÃPlugin¿ÉÒÔ±»Gimpµ÷Ó㬠Gimp µÄPlugin½Ó¿Ú±È½Ï¼òµ¥£¬ÔÚgimpÆô¶¯Ê±½«²éѯËùÓеÄPlugin²¢×¢²áµ½Ò»¸öPDB £¨procedural database£©ÖУ¬Ã¿¸öPluginÖ»ÐèҪʵÏÖÏÂÃæµÄ½á¹¹£º

¡¡¡¡
ÒýÓÃ:
typedef void (? GimpInitProc) (void);

¡¡¡¡ typedef void (? GimpQuitProc) (void);

¡¡¡¡ typedef void (? GimpQueryProc) (void);

¡¡¡¡ typedef void (? GimpRunProc) (gchar ?name,

¡¡¡¡ gint nparams,

¡¡¡¡ GimpParam ?param,

¡¡¡¡ gint ?nreturn_vals,

¡¡¡¡ GimpParam ??return_vals);

¡¡¡¡ struct _GimpPluginInfo

¡¡¡¡ {

¡¡¡¡ /? Plugin³õʼ»¯º¯Êý ?/

¡¡¡¡ GimpInitProc init_proc;

¡¡¡¡ /? PluginÍƳöº¯Êý ?/

¡¡¡¡ GimpQuitProc quit_proc;

¡¡¡¡ /? ¸æÖªËÞÖ÷³ÌÐò±¾PluginµÄ¹¦ÄÜ,Ö´ÐÐ×¢²áµ½PDBµÄ¹¦ÄÜ ?/

¡¡¡¡ GimpQueryProc query_proc;

¡¡¡¡ /? ʵÏÖPluginµÄ¹¦ÄÜ ?/

¡¡¡¡ GimpRunProc run_proc;

¡¡¡¡ };
????????????????????????????????????????????????

¡¡¡¡ GimpµÄPlugin¾ÍÊÇͨ¹ýÉÏÃæµÄËĸöº¯ÊýÀ´ÊµÏֵġ£

¡¡¡¡ ¹ØÓÚLinux ÏÂÃæµÄPluginµÄʹÓúͱà³Ì¾Í½éÉܵ½ÕâÀÆäÖÐNetscape/MozillaµÄPlugin±à³Ì×îΪ¸´ÔÓ£¬²»¹ý¶ÔÓÐÒ»¶¨±à³Ì¾­ÑéµÄÓû§À´Ëµ£¬ºÃºÃÑо¿Ò»Ï MozillaµÄPlugin±à³ÌÊÇ»áºÜÓкô¦µÄ¡£

¡¡¡¡ ±¾ÎĵÄËùÓÐÀý×Ó³ÌÐò¶¼ÔÚLinux-Plugin-Example.zipÖУ¬Óû§¿ÉÒÔµ½http://opencjk.org/Linux-Plugin- Example.zipÍøÖ·×ÔÐÐÏÂÔØ¡£ ËùÓгÌÐò¾ùÔÚRedHat 7.0¡¢gcc-2.96¡¢ glibc-2.1.92 ϱàÒëͨ¹ý¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ