Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓƵ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
CTK¿ò¼ÜʹÓüòÃ÷½Ì³Ì
 
  10963  次浏览      20
 2021-3-19 
 
±à¼­ÍƼö:
±¾ÎÄÖ÷ҪΧÈÆ 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

DESTDIR = $$PWD/../bin

Ö÷º¯ÊýÖмÓÔزå¼þ£¬Æô¶¯¿ò¼Ü£º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²å¼þ£¬ËùÓÐÓû§²å¼þ¶¼Ó¦¸ÃÓÐÕâÑùÒ»·ÝÉêÃ÷

   
10963 ´Îä¯ÀÀ       20
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
Öع¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

Öع¹-¸ÄÉƼÈÓдúÂëµÄÉè¼Æ
Èí¼þÖع¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù 8-23[ÌØ»Ý]
LinuxÄں˱à³Ì¼°É豸Çý¶¯ 8-15[±±¾©]
Python¡¢Êý¾Ý·ÖÎöÓë»úÆ÷ѧϰ 8-23[ÌØ»Ý]
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ 8-22[ÏßÉÏ]
QTÓ¦Óÿª·¢ 9-5[±±¾©]
 
×îÐÂÎÄÕÂ
.NET Core 3.0 Õýʽ¹«²¼£ºÐÂÌØÐÔÏêϸ½â¶Á
.NET Core²¿ÊðÖÐÄã²»Á˽âµÄ¿ò¼ÜÒÀÀµÓë¶ÀÁ¢²¿Êð
C# eventḬ̈߳²È«
¼òÎö .NET Core ¹¹³ÉÌåϵ
C#¼¼ÊõÂþ̸֮À¬»ø»ØÊÕ»úÖÆ(GC)
×îпγÌ
.NetÓ¦Óÿª·¢
C#¸ß¼¶¿ª·¢¼¼Êõ
.NET ¼Ü¹¹Éè¼ÆÓëµ÷ÊÔÓÅ»¯
ASP.NET Core Web ¿ª·¢
ASP.Net MVC¿ò¼ÜÔ­ÀíÓëÓ¦Óÿª·¢
³É¹¦°¸Àý
º½Ìì¿Æ¹¤¼¯ÍÅ×Ó¹«Ë¾ DotNetÆóÒµ¼¶Ó¦ÓÃÉè¼ÆÓ뿪·¢
ÈÕÕÕ¸Û¼¯ .NET Framewor
Éñ»ªÐÅ .NETµ¥Ôª²âÊÔ
̨´ïµç×Ó .NET³ÌÐòÉè¼ÆÓ뿪·¢
Éñ»ªÐÅÏ¢ .NETµ¥Ôª²âÊÔ