±à¼ÍƼö: |
±¾ÎÄÖ÷ÒªÎ§ÈÆ CTK£¬Ì½Ë÷ C++ ÖеÄÄ£¿é»¯¼¼Êõ£¬²¢Äܹ»»ùÓÚ CTK ¿ìËٴ
C++ ×é¼þ»¯¿ò¼Ü£¬Ï£Íû¿ÉÒÔΪÄúµÄѧϰ´øÀ´ÊÕ»ñ¡£ ÎÄÕÂÀ´×ÔÓÚljjww.com£¬ÓÉ»ðÁú¹ûAlice±à¼ÍƼö¡£ |
|
CTK¿ò¼Üʵ¼ÊÓ¦ÓñȽϿɿ¿£¬µ«ÍøÉÏ×ÊÁϺÜÉÙ¡£±¾½Ì³ÌÎ§ÈÆ CTK£¬Ì½Ë÷
C++ ÖеÄÄ£¿é»¯¼¼Êõ£¬²¢Äܹ»»ùÓÚ CTK ¿ìËٴ C++ ×é¼þ»¯¿ò¼Ü£¬±ÜÃâºóÀ´µÄÈË×ßÍä·¡£±¾½Ì³ÌµÄÔ´ÂëÏÂÔØµØÖ·£ºÏîĿԴ´úÂë¡£
CTK½éÉÜ
CTK Ϊ֧³ÖÉúÎïҽѧͼÏñ¼ÆËãµÄ¹«¹²¿ª·¢°ü£¬ÆäÈ«³ÆÎª Common Toolkit¡£CTK²å¼þ¿ò¼ÜµÄÉè¼ÆÓкܴóµÄÁé¸ÐÀ´×ÔOSGi²¢ÇÒʹµÃÓ¦ÓóÌÐòÓÉÐí¶à²»Í¬µÄ×é¼þ×éºÏ³ÉÒ»¸ö¿ÉÀ©Õ¹Ä£ÐÍ¡£Õâ¸öÄ£ÐÍÔÊÐíͨ¹ýÄÇЩ×é¼þ¼ä¹²Ïí¶ÔÏóµÄ·þÎñͨÐÅ¡£
µ±Ç°£¬CTK ¹¤×÷µÄÖ÷Òª·¶Î§°üÀ¨£º
1.DICOM£ºÌṩÁË´Ó PACS ºÍ±¾µØÊý¾Ý¿âÖвéѯºÍ¼ìË÷µÄ¸ß¼¶Àà¡£°üº¬
Qt ²¿¼þ£¬¿ÉÒÔÇáËɵØÉèÖ÷þÎñÆ÷Á¬½Ó£¬²¢·¢ËͲéѯºÍ²é¿´½á¹û¡£
2.DICOM Application Hosting£ºÄ¿±êÊÇ´´½¨
DICOM Part 19 Application Hosting specifications µÄ
C++ ²Î¿¼ÊµÏÖ¡£ËüÌṩÁËÓÃÓÚ´´½¨Ö÷»úºÍÍйÜÓ¦ÓóÌÐòµÄ»ù´¡Éè¡£
3.Widgets£ºÓÃÓÚÉúÎïҽѧ³ÉÏñÓ¦ÓÃµÄ Qt Widgets ¼¯ºÏ¡£
4.Plugin Framework£ºÓÃÓÚ C++ µÄ¶¯Ì¬×é¼þϵͳ£¬ÒÔ
OSGi ¹æ·¶ÎªÄ£ÐÍ¡£ËüÖ§³ÖÒ»¸ö¿ª·¢Ä£ÐÍ£¬ÔÚÕâ¸öÄ£ÐÍÖУ¬Ó¦ÓóÌÐò£¨¶¯Ì¬µØ£©ÓÉÐí¶à²»Í¬£¨¿ÉÖØÓõģ©×é¼þ×é³É£¬×ñÑÃæÏò·þÎñµÄ·½·¨¡£
5.Command Line Interfaces£ºÒ»ÖÖÔÊÐí½«Ëã·¨±àдΪ×Ô°üº¬¿ÉÖ´ÐгÌÐòµÄ¼¼Êõ£¬¿ÉÒÔÔÚ¶à¸öÖÕ¶ËÓû§Ó¦ÓóÌÐò»·¾³ÖÐʹÓ㬶øÎÞÐèÐ޸ġ£
ʹÓà CTK Plugin Framework µÄºÃ´¦
ÓÉÓÚ CTK Plugin Framework »ùÓÚ OSGi£¬Òò´ËËü¼Ì³ÐÁËÒ»Öַdz£³ÉÊìÇÒÍêÈ«Éè¼ÆµÄ×é¼þϵͳ£¬ÕâÔÚ
Java ÖÐÓÃÓÚ¹¹½¨¸ß¶È¸´ÔÓµÄÓ¦ÓóÌÐò£¬Ëü½«ÕâЩºÃ´¦´ø¸øÁ˱¾µØ£¨»ùÓÚ Qt µÄ£©C++ Ó¦ÓóÌÐò¡£ÒÔÏÂÄÚÈÝÕª×Ô
Benefits of Using OSGi£¬²¢ÊÊÓ¦ÓÚ CTK Plugin Framework£º
½µµÍ¸´ÔÓÐÔ
ʹÓà CTK Plugin Framework ¿ª·¢Òâζ×Å¿ª·¢²å¼þ£¬ËüÃÇÒþ²ØÁËÄÚ²¿ÊµÏÖ£¬²¢Í¨¹ý¶¨ÒåÁ¼ºÃµÄ·þÎñÀ´ºÍÆäËü²å¼þͨÐÅ¡£Òþ²ØÄÚ²¿»úÖÆÒâζ×ÅÒÔºó¿ÉÒÔ×ÔÓɵظü¸ÄʵÏÖ£¬Õâ²»½öÓÐÖúÓÚ
Bug ÊýÁ¿µÄ¼õÉÙ£¬»¹Ê¹µÃ²å¼þµÄ¿ª·¢±äµÃ¸ü¼Ó¼òµ¥£¬ÒòΪֻÐèҪʵÏÖÒѾ¶¨ÒåºÃµÄÒ»¶¨ÊýÁ¿µÄ¹¦Äܽӿڼ´¿É¡£
¸´ÓÃ
±ê×¼»¯µÄ×é¼þÄ£ÐÍ£¬Ê¹µÃÔÚÓ¦ÓóÌÐòÖÐʹÓõÚÈý·½×é¼þ±äµÃ·Ç³£ÈÝÒס£
ÏÖʵÇé¿ö
CTK Plugin Framework ÊÇÒ»¸ö¶¯Ì¬¿ò¼Ü£¬Ëü¿ÉÒÔ¶¯Ì¬µØ¸üвå¼þºÍ·þÎñ¡£ÔÚÏÖʵÊÀ½çÖУ¬Óкܶೡ¾°¶¼ºÍ¶¯Ì¬·þÎñÄ£ÐÍÏàÆ¥Åä¡£Òò´Ë£¬Ó¦ÓóÌÐò¿ÉÒÔÔÚÆäËùÊôµÄÁìÓòÖÐÖØÓÃ
Service Registry µÄÇ¿´ó»ùÔª£¨×¢²á¡¢»ñÈ¡¡¢Óø»ÓбíÏÖÁ¦µÄ¹ýÂËÓïÑÔÁÐ±í¡¢µÈ´ý·þÎñµÄ³öÏÖºÍÏûʧ£©¡£Õâ²»½ö½ÚÊ¡Á˱àд´úÂ룬»¹ÌṩÁËÈ«¾Ö¿É¼ûÐÔ¡¢µ÷ÊÔ¹¤¾ßÒÔ¼°±ÈΪרÓýâ¾ö·½°¸ÊµÏֵĸü¶àµÄ¹¦ÄÜ¡£ÔÚÕâÑùµÄ¶¯Ì¬»·¾³Ï±àд´úÂëÌýÆðÀ´ËƺõÊǸöجÃΣ¬µ«ÐÒÔ˵ÄÊÇ£¬ÓÐÖ§³ÖÀàºÍ¿ò¼Ü¿ÉÒÔÏû³ý´ó²¿·Ö£¨Èç¹û²»ÊÇÈ«²¿µÄ»°£©Í´¿à¡£
¿ª·¢¼òµ¥
CTK Plugin Framework ²»½ö½öÊÇ×é¼þµÄ±ê×¼£¬Ëü»¹Ö¸¶¨ÁËÈçºÎ°²×°ºÍ¹ÜÀí×é¼þ¡£Õâ¸ö
API ¿ÉÒÔ±»²å¼þÓÃÀ´Ìṩһ¸ö¹ÜÀí´úÀí£¬Õâ¸ö¹ÜÀí´úÀí¿ÉÒԷdz£¼òµ¥£¬ÈçÃüÁî shell¡¢Í¼ÐÎ×ÀÃæÓ¦ÓóÌÐò¡¢Amazon
EC2 µÄÔÆ¼ÆËã½Ó¿Ú¡¢»ò IBM Tivoli ¹ÜÀíϵͳ¡£±ê×¼»¯µÄ¹ÜÀí API ʹµÃÔÚÏÖÓкÍδÀ´µÄϵͳÖм¯³É
CTK Plugin Framework ±äµÃ·Ç³£ÈÝÒס£
¶¯Ì¬¸üÐÂ
OSGi ×é¼þÄ£ÐÍÊÇÒ»¸ö¶¯Ì¬Ä£ÐÍ£¬²å¼þ¿ÉÒÔÔÚ²»¹Ø±ÕÕû¸öϵͳµÄÇé¿öϱ»°²×°¡¢Æô¶¯¡¢Í£Ö¹¡¢¸üкÍÐ¶ÔØ¡£
×ÔÊÊÓ¦
OSGi ×é¼þÄ£ÐÍÊÇ´ÓÍ·Éè¼ÆµÄ£¬ÒÔÔÊÐí×é¼þµÄ»ìºÏºÍÆ¥Åä¡£Õâ¾ÍÒªÇó±ØÐëÖ¸¶¨×é¼þµÄÒÀÀµ¹ØÏµ£¬²¢ÇÒÐèÒª×é¼þÔÚÆä¿ÉÑ¡ÒÀÀµÐÔ²¢²»×ÜÊÇ¿ÉÓõĻ·¾³ÖÐÉú´æ¡£Service
Registry ÊÇÒ»¸ö¶¯Ì¬×¢²á±í£¬ÆäÖвå¼þ¿ÉÒÔ×¢²á¡¢»ñÈ¡ºÍ¼àÌý·þÎñ¡£ÕâÖÖ¶¯Ì¬·þÎñÄ£ÐÍÔÊÐí²å¼þÕÒ³öϵͳÖпÉÓõŦÄÜ£¬²¢µ÷ÕûËüÃÇËùÄÜÌṩµÄ¹¦ÄÜ¡£ÕâʹµÃ´úÂë¸ü¼ÓÁé»î£¬²¢ÇÒÄܹ»¸üºÃµØÊÊÓ¦±ä»¯¡£
͸Ã÷ÐÔ
²å¼þºÍ·þÎñÊÇ CTK ²å¼þ»·¾³ÖеÄÒ»µÈ¹«Ãñ¡£¹ÜÀí API ÌṩÁ˶Բå¼þµÄÄÚ²¿×´Ì¬µÄ·ÃÎÊ£¬ÒÔ¼°²å¼þÖ®¼äµÄÁ¬½Ó·½Ê½¡£¿ÉÒÔÍ£Ö¹²¿·ÖÓ¦ÓóÌÐòÀ´µ÷ÊÔij¸öÎÊÌ⣬»òÕß¿ÉÒÔÒýÈëÕï¶Ï²å¼þ¡£
°æ±¾¿ØÖÆ
ÔÚ CTK Plugin Framework ÖУ¬ËùÓеIJå¼þ¶¼¾¹ýÑϸñµÄ°æ±¾¿ØÖÆ£¬Ö»ÓÐÄܹ»Ð×÷µÄ²å¼þ²Å»á±»Á¬½ÓÔÚÒ»Æð¡£
¼òµ¥
CTK ²å¼þÏà¹ØµÄ API ·Ç³£¼òµ¥£¬ºËÐÄ API ²»µ½ 25 ¸öÀà¡£Õâ¸öºËÐÄ API ×ãÒÔ±àд²å¼þ¡¢°²×°¡¢Æô¶¯¡¢Í£Ö¹¡¢¸üкÍÐ¶ÔØËüÃÇ£¬²¢ÇÒ»¹°üº¬ÁËËùÓеļàÌýÀà¡£
ÀÁ¼ÓÔØ
ÀÁ¼ÓÔØÊÇÈí¼þÖÐÒ»¸öºÜºÃµÄµã£¬OSGi ¼¼ÊõÓкܶàµÄ»úÖÆÀ´±£Ö¤Ö»Óе±ÀàÕæÕýÐèÒªµÄʱºò²Å¿ªÊ¼¼ÓÔØËüÃÇ¡£ÀýÈ磬²å¼þ¿ÉÒÔÓööººÊ½Æô¶¯£¬µ«ÊÇÒ²¿ÉÒÔ±»ÅäÖÃΪ½öµ±ÆäËü²å¼þʹÓÃËüÃÇʱ²ÅÆô¶¯¡£·þÎñ¿ÉÒÔ±»×¢²á£¬µ«Ö»ÓÐÔÚʹÓÃʱ²Å´´½¨¡£ÕâЩÀÁ¼ÓÔØ³¡¾°£¬¿ÉÒÔ½ÚÊ¡´óÁ¿µÄÔËÐÐʱ³É±¾¡£
·Ç¶ÀÕ¼ÐÔ
CTK Plugin Framework ²»»á½Ó¹ÜÕû¸öÓ¦ÓóÌÐò£¬Äã¿ÉÒÔÑ¡ÔñÐԵؽ«ËùÌṩµÄ¹¦Äܱ©Â¶¸øÓ¦ÓóÌÐòµÄijЩ²¿·Ö£¬»òÕßÉõÖÁ¿ÉÒÔÔÚͬһ¸ö½ø³ÌÖÐÔËÐиÿò¼ÜµÄ¶à¸öʵÀý¡£
·ÇÇÖÈë
ÔÚÒ»¸ö CTK ²å¼þ»·¾³ÖУ¬²»Í¬²å¼þ¾ùÓÐ×Ô¼ºµÄ»·¾³¡£ËüÃÇ¿ÉÒÔʹÓÃÈκÎÉèÊ©£¬¿ò¼Ü¶Ô´Ë²¢ÎÞÏÞÖÆ¡£CTK
·þÎñûÓÐÌØÊâµÄ½Ó¿ÚÐèÇó£¬Ã¿¸ö QObject ¶¼¿ÉÒÔ×÷Ϊһ¸ö·þÎñ£¬Ã¿¸öÀࣨҲ°üÀ¨·Ç QObject£©¶¼¿ÉÒÔ×÷Ϊһ¸ö½Ó¿Ú¡£
CTK±àÒë
ʹÓÃcmake±àÒë³öÓëϵͳ°æ±¾ÏàÓ¦µÄ¶¯Ì¬¿â¡£²Î¼ûCTK±àÒë½Ì³Ì(64λ»·¾³ Windows + Qt
+ MinGW»òMSVC + CMake)¡£
ÏîÄ¿½á¹¹
ÓÉÓÚÿһ¸ö²å¼þ¶¼Òª½¨Ò»¸ö×ÓÏîÄ¿£¬±¾ÏîÄ¿¸Õ¿ªÊ¼´´½¨Ê±ÔÚQtCreatorÖÐÑ¡Ôñн¨-ÆäËûÏîÄ¿-×ÓĿ¼ÏîÄ¿£¬Ð½¨ÏîÄ¿Ãû³ÆÎªctkExample£¬È»ºó½¨Á¢Ö÷³ÌÐòÈë¿ÚÏîÄ¿£¬ÕâÀィÁ¢Ò»¸ö¿ØÖÆÌ¨ÏîÄ¿£¬È¡Ãû½Ðconsole¡£
¸ü¸ÄÏîÄ¿Êä³ö·¾¶£ºconsole.pro
Ö÷º¯ÊýÖмÓÔØ²å¼þ£¬Æô¶¯¿ò¼Ü£ºmain.cpp
#include <QCoreApplication>
#include "ctkPluginFrameworkFactory.h"
#include "ctkPluginFramework.h"
#include "ctkPluginException.h"
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
a.setApplicationName("ctkExample"); //¸ø¿ò¼Ü´´½¨Ãû³Æ£¬LinuxÏÂûÓÐÕâ²½»á±¨´í
ctkPluginFrameworkFactory factory;//²å¼þ¹¤³§Àà
QSharedPointer<ctkPluginFramework> framework;
framework = factory.getFramework();
try{
framework->init();
framework->start();
}
catch(const ctkPluginException& e){
qDebug() << "framework init fail";
qDebug() << e.message() << e.getType();
}
return a.exec();
} |
Èç¹ûÏë°ÑCTK³õʼ»¯¡¢²å¼þ°²×°Æô¶¯¡¢»ñÈ¡µÈ²Ù×÷·â×°³ÉÒ»¸öÀ࣬ÄÇôҪעÒ⣺ÐèÒª°ÑCTKÏà¹ØµÄ±äÁ¿¶¨Òå³ÉÀàÊôÐÔ£¬²»ÄÜÊǾֲ¿±äÁ¿£¬·ñÔò»á³öÏÖ¸÷ÖÖÎÊÌâÈç»ñÈ¡²»ÁË·þÎñ¡¢·þÎñÒýÓÃΪ¿ÕµÈ¡£
ûÓб¨´íµÄ»°¼°±íʾ²å¼þ¼ÓÔØ³É¹¦£¡
ÆäÖÐQSharedPointer frameworkÕâ¸ö¶ÔÏó±È½ÏÓÐÒâ˼£¬¼È¿ÉÒÔ×÷Ϊ¶ÔÏóÒ²¿ÉÒÔ×÷Ϊ¶ÔÏóÖ¸Õ룬µ«Òª×÷Ϊ²å¼þ¿ò¼ÜʹÓñØÐëÒªÓÃÖ¸Õë·½·¨µ÷Óã¬ËùÒÔ´úÂëÀïʹÓá°->¡±¡£
ÏîÄ¿¼ÓÔØCTK¿ò¼Ü²å¼þ
¸´ÖÆCTK°²×°Ä¿Â¼µ½ÏîÄ¿¸ùĿ¼£¬±àÒë³öµÄ¶¯Ì¬¿â¾Í¿ÉÒÔµ±ÆÕͨ¶¯Ì¬¿âʹÓüÓÔØÁË£¬proÀïÃæ¼ÓÔØ´úÂëΪ£º
LIBS += -L$$PWD/../libs/ctk-0.1
-lCTKCore
LIBS += -L$$PWD/../libs/ctk-0.1/ -lCTKPluginFramework
INCLUDEPATH += $$PWD/../includes/ctk-0.1
DEPENDPATH += $$PWD/../libs/ctk-0.1 |
CTK²å¼þµÄ½Ó¿Ú´¦Àí
CTK¿ò¼ÜÓÉÒ»¸öÒ»¸ö¿É·ÖÀëµÄ²å¼þ×é³É£¬¿ò¼Ü¶Ô²å¼þʶ±ðÓÐÒ»¶¨ÒªÇó£¬Ä¿Ç°ÍøÉϺܶàÒ»Õû¿éÈÓ³öÀ´¶ÔÐÂÈ˲»Ì«ÓѺ㬲©Ö÷ÕâÀï½²½âÊǾ¡Á¿²ð¡£µ¥¸ö²å¼þ×î»ù±¾µÄ¸ñʽҪÇó·Ö³ÉActivator£¬qrcÎļþ£¬ÒÔ¼°MANIFEST.MF£¬ÎÒÃÇÒÔÉú³ÉÒ»¸öÖ÷½çÃæÄ£¿éMainWindowΪÀý¡£
Activator×¢²áÆ÷
ÿ¸ö²å¼þ¶¼ÓÐ×Ô¼ºµÄ×¢²áÆ÷Activator¡£
ÓÒ¼üÏîĿѡÔñн¨×ÓÏîÄ¿-ÆäËûÏîÄ¿-Empty qmake Project£¬ÏîÄ¿Ãû³ÆÎªMainWindow£¬proÎļþÖÐÌí¼Ó´úÂ룺
TEMPLATE = lib
TARGET = MainWindow
DESTDIR = $$PWD/../bin/plugins/$$TARGET
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
#¼ÓÔØctk¿â
LIBS += -L$$PWD/../libs/ctk-0.1 -lCTKCore
LIBS += -L$$PWD/../libs/ctk-0.1/ -lCTKPluginFramework
INCLUDEPATH += $$PWD/../includes/ctk-0.1
#INCLUDEPATH += $$PWD/../libs/ctk-0.1 DEPENDPATH += $$PWD/../libs/ctk-0.1 |
Éú³ÉµÄ²å¼þÃû(TARGET)²»ÒªÓÐÏ»®Ïߣ¬ÒòΪCTK»áĬÈϽ«²å¼þÃûÖеÄÏ»®ÏßÌæ»»³ÉµãºÅ£¬×îºóºó¾Íµ¼ÖÂÕÒ²»µ½²å¼þ¡£
ÏîÄ¿ÖÐÌí¼ÓC++ÀàMainWindowActivator£¬´úÂëÈçÏ£º
mainwindowactivator.h
#ifndef MAINWINDOWACTIVATOR_H
#define MAINWINDOWACTIVATOR_H
#include <QObject>
#include "ctkPluginActivator.h"
class MainWindowActivator : public QObject, public
ctkPluginActivator
{
public:
Q_OBJECT
Q_PLUGIN_METADATA(IID "MainWindow")
//ÏòQtµÄ²å¼þ¿ò¼ÜÉùÃ÷£¬Ï£Íû½«xxx²å¼þ·ÅÈëµ½¿ò¼ÜÖС£
Q_INTERFACES(ctkPluginActivator)
public:
MainWindowActivator();
void start(ctkPluginContext *context);
void stop(ctkPluginContext *context);
};
#endif // MAINWINDOWACTIVATOR_H |
mainwindowactivator.cpp
#include "mainwindowactivator.h"
#include <QDebug>
MainWindowActivator::MainWindowActivator()
{
}
void MainWindowActivator::start(ctkPluginContext
*context)
{
qDebug() << "mainwindow start";
}
void MainWindowActivator::stop(ctkPluginContext
*context)
{
qDebug() << "my plugin stop";
Q_UNUSED(context)
/*
Q_UNUSED,Èç¹ûÒ»¸öº¯ÊýµÄÓÐЩ²ÎÊýûÓÐÓõ½¡¢Ä³Ð©±äÁ¿ Ö»ÉùÃ÷²»Ê¹Ó㬵«ÊÇÓÖ²»Ïë±àÒëÆ÷¡¢ ±à¼Æ÷±¨¾¯±¨£¬ÆäËûûÓÐʲôʵ¼ÊÐÔ×÷ÓÃ
*/
} |
activatorÊDZê×¼µÄQt²å¼þÀ࣬ËüʵÏÖctkPluginActivatorµÄstart¡¢stopº¯Êý²¢¶ÔÍâÌṩ½Ó¿Ú¡£ÎÒÕâÀïÊÇQt5µÄ°æ±¾£¬ËùÒÔʹÓÃQ_PLUGIN_METADATAÉêÃ÷²å¼þ£¬Qt4ÐèÒªÓÃ×Ô¼ºµÄ·½·¨ÊµÏÖ²å¼þ¡£
qrcÎļþ
´´½¨²å¼þµÄ×ÊÔ´Îļþ£¬¸ñʽÈçÏ£º
<RCC>
<qresource prefix="/MainWindow/META-INF">
<file>MANIFEST.MF</file> </qresource>
</RCC> |
²å¼þ¼ÓÔØºó»áѰÕÒͬÃûǰ׺/META-INF£¬ËùÒÔǰ׺¸ñʽ¹Ì¶¨£¬½«MANIFEST.MFÎļþÌí¼Ó½øÀ´
MENIFEST.MFÎļþÄÚÈÝÈçÏ£º
¿ÉÖ±½ÓÔÚMFÎļþÀïÌí¼Ó×Ô¼ºÌØÓеÄÔªÊý¾Ý
Plugin-SymbolicName:MainWindow
Plugin-Version:1.0.0
Plugin-Number:100 #ÔªÊý¾Ý |
×¢Ò⣺Plugin-SymbolicNameÒªÂú×ãÕâÀïµÄǰ׺ÊÇ£ºTARGET/META-INF¸ñʽ¡£TARGETµÄÃû×Ö×îºÃºÍ¹¤³ÌÃûÒ»Ö£¬²»È»¿ÉÄܳöÏÖdevice
not open´íÎó¡£
»ñÈ¡MANIFEST.MFÖеÄÊý¾Ý
QHash<QString,
QString> headers = plugin->getHeaders();
ctkVersion version = ctkVersion::parseVersion(headers.value
(ctkPluginConstants::PLUGIN_VERSION));
QString name = headers.value(ctkPluginConstants::PLUGIN_NAME); |
Îļþ°üº¬ctk²å¼þµÄ»ù±¾ÐÅÏ¢£¬Ö»Òªctk¿ò¼ÜÕý³£Ê¶±ðµ½ÎļþÖÐPlugin-SymbolicNameµÈÐÅÏ¢£¬ÔòÅж¨ËüÊÇÒ»¸öctk²å¼þ£¬Äܹ»Õý³£µ÷ÓÃactivatorÖеÄstart¡¢stopº¯Êý¡£Õâ¸öÎļþÐèÒª¿½µ½²å¼þÉú³É·¾¶Ï£¬proÎļþÖÐÌí¼Ó´úÂ룺
file.path = $$DESTDIR
file.files = MANIFEST.MF
INSTALLS += file |
CTK²å¼þÆôÓÃ
¸ù¾ÝÒÔÉϲ½Ö裬һ¸öCTK²å¼þ½Ó¿Ú¶¨Òå»ù±¾Íê³É£¬ÎÒÃÇÔÚconsoleÏîĿϵ÷Óù۲ì²å¼þÊÇ·ñÄܹ»Õý³£¼ÓÔØ¡£mainº¯ÊýÖпò¼ÜÆô¶¯³É¹¦ºóÌí¼ÓÒÔÏ´úÂ룺
QString dir =
QCoreApplication::applicationDirPath();
dir += "/plugins/MainWindow/libMainWindow.dll";
qDebug() << dir;
QUrl url = QUrl::fromLocalFile(dir);
QSharedPointer<ctkPlugin> plugin;
try
{
plugin = framework->getPluginContext()->installPlugin(url);
}catch(ctkPluginException e){
qDebug() << e.message() << e.getType();
}
try{
plugin->start(ctkPlugin::START_TRANSIENT);
}catch(ctkPluginException e){
qDebug() << e.message() << e.getType();
} |
¿ØÖÆÌ¨´òÓ¡Êä³ö£º
"C:/d/mmm/qt/ctk/ctkExample/bin/plugins/
MainWindow / MainWindow.dll"
mainwindow start |
³É¹¦µ÷ÓÃMainWindowÖÐstartÄÚ´òÓ¡Êä³ö£¬Ôò±íÃ÷ctk²å¼þ½Ó¿ÚÕý³£¶¨Òå²¢Äܳɹ¦¼ÓÔØ¡£ÆäÖÐstart(ctkPlugin::START_TRANSIENT)±íʾÁ¢¼´ÆôÓòå¼þ£¬²»ÉèÖòÎÊýµÄ»°¼ÓÔØºóÒ²²»»áÁ¢¼´´òÓ¡Êä³ö¡£
CTK²å¼þ¼äͨÐÅ
CTK¿ò¼Ü²å¼þ»¯¿ª·¢ÊµÏÖ¹¦ÄܵĸôÀ룬²å¼þͨÐÅÐèÒª²ÎÕչ̶¨±ê×¼£¬ÕâÀï½éÉÜÁ½ÖÖ²å¼þ¼äͨÐŵķ½·¨¡£ÒÔÉÏÃæµÄMainWindowΪÀý£¬Ö÷³ÌÐòÖÐÒÔ½Ó¿Úµ÷Óõķ½·¨µ¯³ö²å¼þÖеĽçÃæ¡£ÓÉÓÚÉæ¼°µ½QtµÄWidget½çÃæ£¬ÇëÏȽ«mainº¯ÊýÖеÄQCoreApplication¸ÄΪQApplication¡£
ͨÐÅ·½·¨1-×¢²á½Ó¿Úµ÷ÓÃ
º¯Êý½Ó¿Ú
½Ó¿Ú¾ÍÊÇ´¿Ð麯ÊýÀ࣬Ҳ¾ÍÊÇ×îÖյķþÎñµÄǰÉí¡£
ÉÏÃæÎÒÃÇÒѾ±àÒë³öÐèÒªµÄ¶¯Ì¬¿â£¬Ê×ÏÈÈ·¶¨ÎÒÃÇÐèÒª²å¼þÏòÍⲿ±©Â¶µÄ¹¦ÄÜÓÐʲô£¬±ÈÈçÕâÀïÎÒÃÇÐèÒªµ¯³ö´°¿Ú½çÃæµÄ²Ù×÷£¬¶¨ÒåÍ·ÎļþÈçÏ£ºimainwindow.h
#ifndef IMAINWINDOW_H
#define IMAINWINDOW_H
#include <QObject>
class iMainWindow
{
public:
virtual void popMainWindow() = 0;
};
Q_DECLARE_INTERFACE(iMainWindow, "interface_mainwindow")
//´Ëºê½«µ±Ç°Õâ¸ö½Ó¿ÚÀàÉùÃ÷Ϊ½Ó¿Ú£¬ ºóÃæµÄÒ»³¤´®¾ÍÊÇÕâ¸ö½Ó¿ÚµÄΨһ±êʶ¡£
#endif // IMAINWINDOW_H |
Q_DECLARE_INTERFACE½«½Ó¿ÚÀàÏòQtϵͳÉêÃ÷£¬È»ºóÌí¼ÓËüµÄʵÏÖ¶ÔÏó£º
½Ó¿ÚµÄʵÏÖ
²å¼þ¾ÍÊÇʵÏÖÕâ¸ö½Ó¿ÚÀàµÄʵÏÖÀ࣬ËùÒÔÀíÂÛÉÏÓжàÉÙ¸öʵÏÖÀà¾ÍÓжàÉÙ¸ö²å¼þ¡£
#ifndef MAINWINDOWPLUGIN_H
#define MAINWINDOWPLUGIN_H
#include <QObject>
#include "../includes/imainwindow.h"
#include "ctkPluginContext.h"
#include "mainwindowdlg.h"
class MainWindowPlugin : public QObject, public
iMainWindow
{
Q_OBJECT
Q_INTERFACES(iMainWindow)
/*
´ËºêÓëQ_DECLARE_INTERFACEºêÅäºÏʹÓá£
Q_DECLARE_INTERFACE£ºÉùÃ÷Ò»¸ö½Ó¿ÚÀà
Q_INTERFACES£ºµ±Ò»¸öÀà¼Ì³ÐÕâ¸ö½Ó¿ÚÀ࣬ ±íÃ÷ÐèҪʵÏÖÕâ¸ö½Ó¿ÚÀà
*/
public:
MainWindowPlugin(ctkPluginContext *context);
virtual void popMainWindow();
private:
ctkPluginContext *m_context;
MainWindowDlg* m_windowDlg;
};
#endif // MAINWINDOWPLUGIN_H |
mainwindowplugin.cpp
#include "mainwindowplugin.h"
MainWindowPlugin::MainWindowPlugin(ctkPluginContext
*context)
:m_context(context)
{
m_windowDlg = new MainWindowDlg;
}
void MainWindowPlugin::popMainWindow()
{
m_windowDlg->show();
} |
ÕâÈÔÊÇQtµÄ²å¼þ¶¨Òå¸ñʽ£¬µ«ÊDz»»á×÷Ϊ²å¼þµ¼³ö£¬Íⲿ¹¦ÄܽӿڿÉÒÔ×Ô¶¨Òå¡£
·þÎñ×¢²á(Activator×¢²á·þÎñ)
¼¤»îÀàÀïÓÐÒ»¸ö¶ÀÕ¼ÖÇÄÜÖ¸Õ룬ָÏò½Ó¿ÚÀࡾʹÓöà̬£¬Ö¸Õë¶¼Ö¸Ïò¸¸Àà¡¿£¬È»ºóÔÚstartÀïnewÒ»¸öʵÏÖÀ࣬ע²áÕâ¸öʵÏÖÀàΪ·þÎñ£¬¹¦ÄÜÊÇʵÏÖ½Ó¿ÚÀàµÄ½Ó¿Ú£¬È»ºó½«ÖÇÄÜÖ¸ÕëÖ¸ÏòÕâ¸öʵÏÖÀà¡£¿ÉÒÔÀí½âΪÒÔºóÏò¿ò¼ÜË÷È¡Õâ¸ö·þÎñµÄʱºò£¬Êµ¼Ê»ñÈ¡µÄ¾ÍÊÇÕâ¸önew³öÀ´µÄʵÏÖÀà¡£Èç¹û²»ÓÃÖÇÄÜÖ¸Õ룬¾ÍÐèÒªÔÚstopÀïÊÖ¶¯deleteÕâ¸öʵÏÖÀà¡£
ÿ¸ö²å¼þ¶¼ÓÐ×Ô¼ºµÄ×¢²áÆ÷Activator£¬¹¦ÄܽڽӿÚÍê³Éºó£¬ÔÚ²å¼þÆô¶¯Ê±×¢²áµ½ctk¿ò¼ÜµÄ·þÎñÖУ¬´úÂëÈçÏ£ºmainwindowactivator.cpp
void MainWindowActivator::start(ctkPluginContext
*context)
{
qDebug() << "mainwindow start";
m_plugin = new MainWindowPlugin(context);
ctkDictionary dic;
context->registerService<iMainWindow>(m_plugin,
dic);
} |
½Ó¿Úµ÷ÓÃ
CTK²å¼þÆôÓú󣬾ͿÉÒÔµ÷Óýӿڡ£
Ö÷º¯Êý¿ò¼Ü¼°²å¼þ¼ÓÔØÍê³Éºó£¬¼´¿Éµ÷Óòå¼þ½Ó¿Ú£¬´úÂëÈçÏ£ºmain.cpp
#include "../includes/imainwindow.h"
¡¡
ctkPluginContext* context = framework-> getPluginContext
();
ctkServiceReference ref =context->getServiceReference
<iMainWindow>();
iMainWindow* mainWindow;
if(ref)
mainWindow = context->getService<iMainWindow>(ref);
if(mainWindow)
mainWindow->popMainWindow(); |
ÔÚ»ñÈ¡·þÎñµÄʱºò£¬ÓÐÁ½¸öÖØÔØ·½Ê½¡¾¿ÉÖ±½ÓʹÓõġ¿
1¡¢iMainWindow*
ret = context->getService <iMainWindow >
(reference);
2¡¢iMainWindow* ret = qobject_cast <iMainWindow*>
(context->getService(reference)); |
·þÎñ¾ÍÊǸù¾Ý½Ó¿ÚµÄʵÀý£¬Ã¿Éú³ÉÒ»¸ö·þÎñ¾Í»áµ÷ÓÃÒ»´Î×¢²áÆ÷µÄstart¡£°Ñ½Ó¿Úµ±×öÀ࣬·þÎñÊǸù¾ÝÀànew³öµÄ¶ÔÏ󣬲å¼þ¾ÍÊǶ¯Ì¬¿âdll¡£
С½á£º½Ó¿Ú¡¢²å¼þ¡¢·þÎñµÄ¹ØÏµ
1¡¢1¶Ô1
1¸ö½Ó¿ÚÀàÓÉ1¸öÀàʵÏÖ£¬Êä³ö1¸ö·þÎñºÍ1¸ö²å¼þ¡£
2¡¢¶à¶Ô1
1¸öÀàʵÏÖÁË2¸ö½Ó¿ÚÀ࣬Êä³ö2¸ö·þÎñºÍ1¸ö²å¼þ£¬ÎÞÂÛÏëʹÓÃÄĸö·þÎñ×îÖÕ¶¼Í¨¹ýÕâͬһ¸ö²å¼þÀ´ÊµÏÖ¡£
3¡¢1¶Ô¶à
1½Ó¿ÚÓÉ2¸öÀàʵÏÖ£¬Ò²¾ÍÊÇijһ¸öÎÊÌâÌṩÁË2ÖÖ½â¾ö˼·£¬Êä³ö1¸ö·þÎñºÍ2¸ö²å¼þ£¬Í¨¹ýctkPluginConstants::SERVICE_RANKINGºÍctkPluginConstants::SERVICE_IDÀ´µ÷Óò»Í¬µÄ²å¼þ¡£ÕâÀïËäÈ»ÓÐÁ½¸ö²å¼þ£¬µ«¶¼ÊDZ»±àÒ뵽ͬһ¸ödllÖеġ£
ij²å¼þÿ´Îµ÷ÓÃÁíÒ»¸ö²å¼þµÄʱºò£¬Ö»»áÉú³ÉÒ»¸öʵÀý£¬È»ºó°ÑʵÀý´æµ½ÄÚ´æµ±ÖУ¬²»»áÒòΪ¶à´Îµ÷ÓöøÉú³É¶à¸ö·þÎñʵÀý¡£
ÔÚʹÓÃ1½Ó¿Ú2²å¼þµÄʱºò£¬ËäÈ»ÊÇÁ½¸ö²å¼þ£¬Ò²»áÓÐÁ½¸ö¼¤»îÀࡾ´ÓÔÀíÉÏÀ´½²1¸ö¼¤»îÀà¾ÍÐÐÁË£¬µ«ÊÇÔÚstartÀï×¢²áÁ½´Î¡¿£¬ÆäÖеÄIIDÖ»ÄÜÓÐÒ»¸ö¡£´ÓQt²å¼þ»ù´¡ÉÏÀ´Ëµ£¬Ò»¸ödllÖ»ÄÜÓÐÒ»¸öIID¡£
ͨÐÅ·½·¨2-ʼþ¼àÌý
CTK¿ò¼ÜÖеÄʼþ¼àÌý£¬¼´¹Û²ìÕßģʽÁ÷³ÌÉÏÊÇÕâÑù£º½ÓÊÕÕß×¢²á¼àÌýʼþ->·¢ËÍÕß·¢ËÍʼþ->½ÓÊÕÕß½ÓÊÕµ½Ê¼þ²¢ÏìÓ¦£»Ïà±Èµ÷Óòå¼þ½Ó¿Ú£¬¼àÌýʼþ²å¼þ¼äÒÀÀµ¹ØÏµ¸üÈõ£¬²»ÓÃÖ¸¶¨Ê¼þµÄ½ÓÊÕ·½ºÍ·¢ËÍ·½ÊÇË¡£
ҪʹÓÃCTK¿ò¼ÜµÄʼþ·þÎñ£¬×¼±¸¹¤×÷Ó¦¸Ã´Ócmake¿ªÊ¼£¬±àÒë³öÖ§³Öʼþ¼àÌýµÄ¶¯Ì¬¿â£¬Ãû³ÆÎªliborg_commontk_eventadmin.dll¡£ÏÖÔÚÒªÍê³ÉµÄÄÚÈÝÊÇ£¬´ÓÉÏÃæÉú³ÉµÄÖ÷´°ÌåÖУ¬ÒÔʼþ¼àÌýµÄ·½Ê½µ÷ÓÃÒ»¸ö×Ó´°Ìå¡£
1¡¢Í¨ÐÅÖ÷ÒªÓõ½ÁËctkEventAdmin½á¹¹Ì壬Ö÷Òª¶¨ÒåÁËÈçϽӿڣº
postEvent£ºÀàͨÐÅÐÎʽÒì²½·¢ËÍʼþ
sendEvent£ºÀàͨÐÅÐÎʽͬ²½·¢ËÍʼþ
publishSignal£ºÐźÅÓë²ÛͨÐÅÐÎʽ·¢ËÍʼþ
unpublishSignal£ºÈ¡Ïû·¢ËÍʼþ
subscribeSlot£ºÐźÅÓë²ÛͨÐÅÐÎʽ¶©ÔÄʱ¼ä£¬·µ»Ø¶©ÔĵÄID
unsubscribeSlot£ºÈ¡Ïû¶©ÔÄʼþ
updateProperties£º¸üÐÂij¸ö¶©ÔÄIDµÄÖ÷Ìâ
2¡¢Í¨ÐŵÄÊý¾ÝÊÇ£ºctkDictionary
Æäʵ¾ÍÊǸöhash±í£ºtypedef QHash<QString,QVariant>
ctkDictionary
¼ÓÔØEventAdmin¶¯Ì¬¿â
Ìí¼Ó¶¯Ì¬¿â¿ÉÒÔʹÓÃctkPluginFrameworkLauncher£¬´úÂëÈçÏ£ºmain.cpp
ctkPluginFrameworkLauncher::addSearchPath
("../libs/ctk-0.1/plugins");
ctkPluginFrameworkLauncher::start("org.commontk
.eventadmin");
¡¡
// Í£Ö¹²å¼þ
ctkPluginFrameworkLauncher::stop(); |
ÐèÒªÔÚ¿ò¼Ü¼ÓÔØÇ°µ÷Óá£
ʼþ×¢²á¼àÌý(½ÓÊÕ²å¼þ)
Ê×ÏȱàдÎÒÃÇÐèÒªµÄ½ÓÊÕÕßÄ£¿é£¬²¢×¢²á¼àÌýʼþ£¬ÕâÀïÎÒÃÇн¨Ò»¸öÄ£¿éClient1£¬Ä£¿éµÄ½Ó¿Ú´¦Àí²Î¼ûÉÏÃæ¡°CTK²å¼þµÄ½Ó¿Ú´¦Àí¡±¡£²å¼þ²¿·Ö´úÂëÈçÏ£º
client1plugin.h
#ifndef CLIENT1PLUGIN_H
#define CLIENT1PLUGIN_H
#include <QObject>
#include "ctkPluginContext.h"
#include "service/event/ctkEventAdmin.h"
#include "service/event/ctkEventHandler.h"
#include "client1dlg.h"
class Client1Plugin : public QObject, public ctkEventHandler
{
Q_OBJECT
Q_INTERFACES(ctkEventHandler)
public:
Client1Plugin(ctkPluginContext *context);
protected:
void handleEvent(const ctkEvent& event);
signals:
void openDlg();
public slots:
void onOpenDlg();
private:
void registToMainWindow();
ctkPluginContext *m_context;
Client1Dlg* m_clientDlg;
};
#endif |
#include "client1plugin.h"
#include <service/event/ctkEventConstants.h>
Client1Plugin::Client1Plugin(ctkPluginContext
*context)
:m_context(context)
{
m_clientDlg = new Client1Dlg;
connect(this, SIGNAL(openDlg()), this, SLOT(onOpenDlg()), Qt::QueuedConnection);
//×¢²á¼àÌýÐźÅ"zhimakaimen"
ctkDictionary dic;
dic.insert(ctkEventConstants::EVENT_TOPIC, "zhimakaimen");
context->registerService<ctkEventHandler>(this,
dic);
}
void Client1Plugin::handleEvent(const ctkEvent&
event)
{
//½ÓÊÕ¼àÌýʼþ½Ó¿Ú
if(event.getTopic() == "zhimakaimen")
{
emit openDlg();
//ÕâÀïÓÃÁËÐźŲÛÒì²½£¬ÒòΪÏß³ÌÖв»Äܵ÷ÓýçÃæÔªËØ
}
} |
ÓëÉÏÃæ×Ô¶¨Òå½Ó¿Ú²»Í¬£¬ÕâÀïÎÒÃÇʵÀý»¯ctkEventHandler¶ÔÏ󣬲¢ÊµÏÖhandleEvent½Ó¿Ú¡£¹¹Ô캯ÊýÖÐ×¢²áµÄ·þÎñ¶ÔÏóÊÇctkEventHandler£¬ÔÚ×¢²áʱָ¶¨´¥·¢µÄʼþ£¬µ±Ê¼þ´¥·¢Ê±µ÷ÓøöÔÏóµÄhandleEventʵÏÖÖ¸¶¨²Ù×÷¡£
ʼþ·¢ËÍ(·¢ËͲå¼þ)
¼àÌý¶ÔÏóÍê³Éºóµ÷ÓñȽϼòµ¥£¬±ÈÈçÎÒÃÇÖ±½ÓÔÚ´°ÌåµÄ²Ëµ¥À¸ÖУ¬µã»÷actoinµ÷Ó㬴úÂëÈçÏ£ºmainwindowdlg.cpp
#include "mainwindowdlg.h"
#include "ui_mainwindowdlg.h"
#include "service/event/ctkEvent.h"
#include "service/event/ctkEventAdmin.h"
#include "service/event/ctkEventHandler.h"
MainWindowDlg::MainWindowDlg(ctkPluginContext
* context , QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindowDlg),
m_context(context)
{
ui->setupUi(this);
QAction* action = new QAction("Óû§1");
ui->menubar->addAction(action);
connect(action, SIGNAL(triggered(bool)), this
, SLOT (action_clicked()));
}
MainWindowDlg::~MainWindowDlg()
{
delete ui;
}
void MainWindowDlg::action_clicked()
{
//»ñȡʼþ·þÎñ½Ó¿Ú
ctkServiceReference ref;
ctkEventAdmin* eventAdmin;
ref = m_context->getServiceReference<ctkEventAdmin>();
if(ref)
{
eventAdmin = m_context->getService<ctkEventAdmin>(ref);
m_context->ungetService(ref);
}
//·¢ËÍʼþ
ctkDictionary message;
if(eventAdmin)
eventAdmin->postEvent(ctkEvent("zhimakaimen",
message));
} |
ʼþ·¢ËͶþÖÖ·½Ê½£ºÀàͨÐÅ¡¢ÐźŲÛͨÐÅ
1¡¢ÀàͨÐÅ
ÔÀí¾ÍÊÇÖ±½Ó½«ÐÅϢʹÓÃCTKµÄeventAdmin½Ó¿Úsend/post³öÈ¥¡£
2¡¢ÐźŲÛͨÐÅ
ÔÀíÊǽ«Qt×Ô¼ºµÄÐźÅÓëCTKµÄ·¢ËÍʼþ°ó¶¨¡¢²ÛÓëʼþ¶©Ôİ󶨡£
¶þÖÖ·½Ê½µÄÇø±ð£º
1¡¢Í¨¹ýeventʼþͨÐÅ£¬ÊÇÖ±½Óµ÷ÓÃCTKµÄ½Ó¿Ú£¬°ÑÊý¾Ý·¢Ë͵½CTK¿ò¼Ü£»Í¨¹ýÐźŲ۷½Ê½£¬»áÏÈÔÚQtµÄÐźŲۻúÖÆÖÐתһ´Î£¬ÔÙ·¢Ë͵½CTK¿ò¼Ü¡£¹ÊЧÂÊÉÏÀ´½²£¬event·½Ê½ÐÔÄܸßÓÚÐźŲ۷½Ê½¡£
2¡¢Á½ÖÖ·½Ê½·¢ËÍÊý¾Ýµ½CTK¿ò¼Ü£¬Õâ¸öÊý¾Ý°üº¬£ºÖ÷Ìâ+ÊôÐÔ¡£Ö÷Ìâ¾ÍÊÇtopic£¬ÊôÐÔ¾ÍÊÇctkDictionary¡£
Ò»¶¨Òª×¢Òâsignal·½Ê½µÄÐźŶ¨Ò壬²ÎÊý²»ÄÜÊÇ×Ô¶¨ÒåµÄ£¬Ò»¶¨ÒªÊÇctkDictionary£¬²»È»»á±¨ÐźŲ۲ÎÊýÒì³£´íÎó¡£
3¡¢Á½ÖÖ·½Ê½¿ÉÒÔ»ìÓã¬Èç·¢ËÍeventʼþ£¬ÔÙͨ¹ý²ÛÈ¥½ÓÊÕ£»·¢ËÍsignalʼþ£¬ÔÙͨ¹ýeventÊǽÓÊÕ¡£
4¡¢Í¬²½£ºsendEvent¡¢Qt::DirectConnection£»Òì²½£ºpostEvent¡¢Qt::QueuedConnection
ÕâÀïµÄͬ²½ÊÇÖ¸£º·¢ËÍʼþÖ®ºó£¬¶©ÔÄÁËÕâ¸öÖ÷ÌâµÄÊý¾Ý±ã»á´¦ÀíÊý¾Ý¡¾handleEvent¡¢slot¡¿£¬´¦ÀíµÄ¹ý³ÌÊÇÔÚ·¢ËÍÕßµÄÏß³ÌÍê³ÉµÄ¡£¿ÉÒÔÀí½âΪÔÚ·¢ËÍÁËij¸öʼþÖ®ºó£¬»áÁ¢¼´Ö´ÐÐËùÓж©ÔÄ´ËʼþµÄ»Øµ÷º¯Êý¡£
Òì²½£º·¢ËÍʼþÖ®ºó£¬·¢ËÍÕß±ã»á·µ»Ø²»¹Ü£¬¶©ÔÄÁË´ËʼþµÄËùÓвå¼þ»á¸ù¾Ý×Ô¼ºµÄÏûϢѻ·£¬ÂÖµ½ÁË´¦Àíʼþºó²Å»áÈ¥´¦Àí¡£²»¹ýÈç¹û³¤Ê±¼äû´¦Àí£¬CTKÒ²ÓÐ×Ô¼ºµÄ³¬Ê±»úÖÆ¡£Èç¹ûʼþ´¦Àí³ÌÐò»¨·ÑµÄʱ¼ä±ÈÅäÖõij¬Ê±Ê±¼ä³¤£¬ÄÇô¾Í»á±»ÁÐÈëºÚÃûµ¥¡£Ò»µ©´¦Àí³ÌÐò±»ÁÐÈëºÚÃûµ¥£¬Ëü¾Í²»»áÔÙ±»·¢ËÍÈκÎʼþ¡£
²å¼þÒÀÀµ
²å¼þ¼ÓÔØÊ±Ò»°ã¸ù¾ÝÊ××Öĸ´óС×Ô¶¯¼ÓÔØ£¬ËùÒÔÔÚClient1ÆôÓÃʱ£¬MainWindow»¹Ã»Óб»µ÷Óã¬ËùÒÔ·¢Ë͵ġ±event/registAction¡±Ê¼þûÓнÓÊÕ·½£¬ÕâÑù¾ÍÒª¿¼Âǵ½²å¼þÒÀÀµ¹ØÏµ£¬ÔÚMANIFEST.MFÖÐÌí¼ÓÒÀÀµ£º
Plugin-SymbolicName:Client1
Plugin-Version:1.0.0
Require-Plugin:MainWindow; plugin-version="[1.0,2.0)"
; resolution ="mandatory" |
MainWindow£ºÎªÐèÒªÒÀÀµµÄ²å¼þÃû¡¾¾ÍÊÇÁíÒ»¸ö²å¼þÔÚMANIFEST.MFÀïµÄPlugin-SymbolicName¡¿£»
[1.0,2.0)£ºÎªMainWindowµÄ°æ±¾£¬ÕâÀïÊÇ×ó±ÕÓÒ¿ªÇø¼ä£¬Ä¬ÈÏÊÇ1.0,£»
resolution£ºÓÐÁ½¸öÑ¡Ôñ£¬optional¡¢mandatory¡£Ç°ÕßÊÇÈõÒÀÀµ£¬¾ÍËãÒÀÀµµÄ²å¼þûÓУ¬µ±Ç°²å¼þÒ²ÄÜÕý³£Ê¹Ó㬺óÕßÊÇÇ¿ÒÀÀµ£¬Èç¹ûûÓÐÒÀÀµµÄ²å¼þ£¬¾Íµ±Ç°²å¼þ¾Í²»Äܱ»start¡£
ÕâÑù¾ÍÏò¿ò¼ÜÉêÃ÷ÁË£¬¸Ã²å¼þ¼ÓÔØÊ±ÐèÒªÏȼÓÔØMainWindow²å¼þ£¬ËùÓÐÓû§²å¼þ¶¼Ó¦¸ÃÓÐÕâÑùÒ»·ÝÉêÃ÷ |