
DynLibã©ã€ãã©ãªã¯ããããžã§ã¯ãã§ã¢ãžã¥ãŒã«ééä¿¡ïŒEXE <-> DLLãDLL <-> DLLïŒã䜿çšããéçºè
ã«äŸ¿å©ãªããŒã«ãæäŸããã³ãŒãã®æéãšéã倧å¹
ã«åæžããŸãã
DynLibã¯äžå¯æ¬ ãªéçºããŒã«ã«ãªããŸããã ç«ã®äžã§çµæãå
±æããŸãã
åŸæ¥ã®DLLå®è£
ã¢ãããŒãã®æ¬ ç¹
åŸæ¥ã®ã¢ãããŒãïŒå®è£
ïŒã®äž»ãªæ¬ ç¹ã¯æ¬¡ã®ãšããã§ãã
- åå空éã䜿çšããèœåã®æ¬ åŠ
- å€æ°ã®ãŠãŒãã£ãªãã£ã³ãŒããå¿
èŠã§ãã
- ã©ã€ãã©ãªã®åçããŒããå®è£
ããå Žå;
- èšè¿°åïŒãŸãã¯ä»ã®æé»çãªæ§é ïŒããã³ã©ãããŒã¯ã©ã¹ã䜿çšããŠãã¯ã©ã¹ãéããŠã¢ãžã¥ãŒã«éçžäºäœçšãå®è£
ããå Žåã
- ãšã¯ã¹ããŒããããé¢æ°ãäŸå€ãã¹ããŒããå¯èœæ§ãããå Žåããšã©ãŒãªã¿ãŒã³ã¡ã«ããºã ãå®è£
ãããšãã
ãããã®åé¡ã¯ãDynLibã©ã€ãã©ãªã䜿çšããŠè§£æ±ºãããŸãïŒ
DynLibã®äŸ
1.éåžžã®DLLã䜿çšãã
ãã£ã¬ã³ãžã ããããŒãã¡ã€ã«ã«è¡šç€ºãããã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠãç°¡åãªæ°åŠæŒç®ãå®è£
ããtest_lib.dllã©ã€ãã©ãªãåçã«æ¥ç¶ããŠäœ¿çšããŸãã
解決çã 次ã®ããããŒãã¡ã€ã«ãäœæãããããžã§ã¯ãã«æ¥ç¶ããå¿
èŠããããŸãã
ããªããã»ããµã¯ãDLLãåçã«ããŒããããªã¹ãããã
sum ã
mulãããã³
epsiloné¢æ°ãå«ã
test :: libã¯ã©ã¹ãçæããŸãã DLLãã¢ããªã±ãŒã·ã§ã³ã«æ¥ç¶ããã«ã¯ãæäŸãããããããŒãã¡ã€ã«test_lib.hppããœãŒã¹ã³ãŒãã«å«ããå¿
èŠããããŸãã 次ã«ãã¯ã©ã¹
test :: libã®ãªããžã§ã¯ããäœæããŸãã ãšã¯ã¹ããŒããããDLLé¢æ°ãžã®ã¢ã¯ã»ã¹ã¯ãããããéããŠå¯èœã§ã ãŸãã¯ã->ãã
2. calculator.dllã©ã€ãã©ãªãŒã®äœæ
ãã£ã¬ã³ãžã ã©ã€ãã©ãªcalculator.dllãäœæããŸããããã¯ãåèšã2ã€ã®æ°å€ã®ç©ãå¹³æ¹æ ¹å€ãèšç®ããå¿
èŠããããŸãã ã©ã€ãã©ãªãåçã«ããŒãããåé¢æ°ãåŒã³åºããŸãã
解決ç
DLLã䜿çšãã
3. calculator.dllã©ã€ãã©ãªãŒã®ã¢ããã°ã¬ãŒãã äŸå€ã®äœ¿çšã
ãã£ã¬ã³ãžã å
¥åå€ãæ£ãããªãå Žåãcalculator.dllã©ã€ãã©ãªã®å¹³æ¹æ ¹
sqrté¢æ°ã¯ãšã©ãŒãè¿ããŸãã
解決ç
DLLã䜿çšãã
sqrt1 = 5 what: exception 'class std::invalid_argument' in method 'sqrt' of class '::team::calculator' with message ' 0'
4. shapes.dllã©ã€ãã©ãªã®å®è£
ã ã€ã³ã¿ãŒãã§ã€ã¹ã®äœ¿çšã
ãã£ã¬ã³ãžã 幟äœåŠçå³åœ¢ïŒæ£æ¹åœ¢ãé·æ¹åœ¢ãåïŒãæäœããããã®shapes.dllã©ã€ãã©ãªãäœæããŸãã ãã¹ãŠã®å³ã¯ãå³ã®äžå¿ã®åº§æšãèŠã€ããããšãã§ããå
±éã®ã€ã³ã¿ãŒãã§ãŒã¹ããµããŒãããå¿
èŠããããŸãã
解決ç
ã©ã€ãã©ãªã®æ¥ç¶æ¹æ³
ã©ã€ãã©ãªã¯ããããŒãã¡ã€ã«ã®åœ¢åŒã§æäŸãããŸãã .libãš.dllã¯å¿
èŠãããŸããã æ¥ç¶ããã«ã¯ã次ã®ãã£ã¬ã¯ãã£ããè¿œå ããŸãã
#include <dl/include.hpp>
ã©ã€ãã©ãªã¢ã€ãã
DynLibã©ã€ãã©ãªã®å€ãã®ã¯ã©ã¹ãšãã¯ãã¯ãäºãã«ç¬ç«ããŠå¥ã
ã«äœ¿çšã§ããŸãã
DL_BLOCK
ä»ã®ãã¹ãŠã®ãã¯ãã®ã³ã³ãããšããŠæ©èœããŸãã
DL_BLOCK (
DL_NS_BLOCK
ä»ã®ãã¹ãŠã®ãã¯ãã®ã³ã³ãããšããŠæ©èœããŸãã ã¯ã©ã¹ã®åå空éãäœæããŸãã
DL_NS_BLOCK( (ns0, ns1, ns2 ⊠) (
DL_EXPORTãé€ã以äžã§èª¬æãããã¯ãã¯ã
DL_BLOCKãŸãã¯
DL_NS_BLOCKã«é
眮ãã
å¿
èŠããããŸãDL_C_LIBRARY
ãã¯ãã®ç®çã¯ãDLLã®åçãªããŒããšé¢æ°ã®èªåã€ã³ããŒããå®è£
ããæ¢è£œã®ã¯ã©ã¹ããŠãŒã¶ãŒã«æäŸããããšã§ãã ãã¯ãã¯æ¬¡ã®ããã«è¡šç€ºãããŸãã
DL_C_LIBRARY(lib_class) ( ( ret_type, call, (name, import_name), arguments ) )
- lib_class-å®è£
ãDynLibã©ã€ãã©ãªã«ãã£ãŠçæãããã¯ã©ã¹ã®ååã
- functions -DLLã«ãã£ãŠãšã¯ã¹ããŒããããé¢æ°ã®ãªã¹ãã 次ã®åœ¢åŒã®ãªã¹ããä»ããŠèšå®
ïŒret_typeãcallãïŒnameãimport_nameïŒãåŒæ°ïŒ- ret_type-é¢æ°ã«ãã£ãŠè¿ãããå€ã®ã¿ã€ãã
- call- åŒã³åºã圢åŒãäŸïŒ__sdtcallã__ cdeclãªã©ã
- name-é¢æ°åïŒãŠãŒã¶ãŒçšïŒ;
- import_nameã¯ãDLLãšã¯ã¹ããŒãããŒãã«ã§æå®ãããé¢æ°ã®ååã§ãè£
食ïŒååšããå ŽåïŒãå«ã¿ãŸãã nameãšimport_nameãäžèŽããå Žåãimport_nameã¯çç¥ã§ããŸãã
- arguments-å
¥ååŒæ°ãæå®ãããªã¹ãïŒåŒæ°ã¿ã€ããåŒæ°åãããã©ã«ãå€ïŒã åŒæ°åãšããã©ã«ãå€ã¯çç¥ã§ããŸãã
äŸïŒ
DL_BLOCK ( DL_C_LIBRARY( my_lib ) ( ( void, __stdcall, (func), (int)(int,s)(double,V,=1.0) ) ( int, __stdcall, (fn, "fn@0"), (int,a) ) ( int, __stdcall, (fn), () ) ) )
DL_C_LIBRARYãã¯ãã«ãã£ãŠçæãããã¯ã©ã¹ã¯ãDLLã®å¢çãè¶ããŠæž¡ãããšã¯ã§ããŸããDL_RECORD
DL_RECORDãã¯ãã¯ã
ã¢ãžã¥ãŒã«ééä¿¡ã§äœ¿çšããããã®ããã¯ããŒã¿æ§é ãçæããŸãã ããã«ããã¯ãã«ãªã¹ããããŠãããã¹ãŠã®åŒæ°ã䜿çšããŠã³ã³ã¹ãã©ã¯ã¿ãŒãäœæãããŸãã
DL_RECORD( record_name ) ( (type, name, =default_value) )
äŸïŒ
DL_LIBRARY
DL_LIBRARYãã¯ãã¯ãããã€ãã®ã¿ã¹ã¯ãå®è¡ããŸãã
- EXEïŒDLLïŒãšDLLéã®ã€ã³ã¿ãŒãã§ãŒã¹ã®èª¬æïŒããã¥ã¡ã³ãïŒãšããŠæ©èœããŸãã
- ã©ã€ãã©ãªé¢æ°ãéçºè
ã«èªåçã«ãšã¯ã¹ããŒãããããã«å¿
èŠãªæ§é ãå«ãŸããŠããŸãã
- æå®ãããã€ã³ã¿ãŒãã§ã€ã¹ã§DLLãããŒããããŠãŒã¶ãŒããšã¯ã¹ããŒããããé¢æ°ã«ã¢ã¯ã»ã¹ã§ããã¯ã©ã¹ãå®è£
ããŸãã
- C ++äŸå€ã®æ£ãã䜿çšãæäŸããŸãã
-DLLåŽã®C ++äŸå€ã®èªåãã£ããã
-DLLã®å¢çãä»ããŠå€ãè¿ããäŸå€ã®ååšãéç¥ããŸãã
-äŸå€ãDLLã®åŽã§ãã£ãããããå Žåã®æ°ããäŸå€ã®çæïŒäŸå€ã®çš®é¡ã«é¢ãã説æãšæ
å ±ã®åŸ©å
ïŒ
DL_LIBRARY( name ) ( ( ret_type, name, arguments ) )
DL_LIBRARYãã¯ãã«ãã£ãŠçæãããã¯ã©ã¹ã¯ãDLLã®å¢çãè¶ããŠæž¡ãããšã¯ã§ããŸããããã¯ããã©ã®ããã«æ©èœãããã瀺ãããã«ã次ã®ããããŒãã¡ã€ã«ãæ³åããŠãã ããã
ãã®èª¬æã¯ãDLLéçºè
ã
DL_EXPORTãã¯ãã䜿çšããŠé¢æ°ããšã¯ã¹ããŒãããããã«äœ¿çšããŸãã test1_lib.hppããããŒãã¡ã€ã«ãæ¥ç¶ããããšã«ããããŠãŒã¶ãŒã¯DLLã®æäœãããã«éå§ã§ããŸãã
DL_EXPORT
DL_EXPORTãã¯ã
ã¯ã DLLé¢æ°ããšã¯ã¹ããŒãããããã«èšèšãããŠããŸãã
DL_EXPORT ïŒ
lib_class ã
lib_impl_class ïŒ
- lib_class-察話ã€ã³ã¿ãŒãã§ãŒã¹ãèšè¿°ããã¯ã©ã¹ã®ãã«ããŒã ïŒDL_LIBRARYã§äœ¿çšãããã¯ã©ã¹åïŒ;
- lib_impl_classã¯ã察話ã€ã³ã¿ãŒãã§ãŒã¹ã§æå®ãããæ©èœãå®è£
ããã¯ã©ã¹ã®å®å
šä¿®é£Ÿã¯ã©ã¹åã§ãã
DLLé¢æ°ããšã¯ã¹ããŒãããã«ã¯ã以äžãè¡ãå¿
èŠããããŸãã
- ã¯ã©ã¹ïŒæ§é ïŒãäœæããŸãã
- ã€ã³ã¿ãŒãã§ã€ã¹ããã®åé¢æ°ãéçãšããŠå®çŸ©ããŸãã é¢æ°ã®ã¹ã³ãŒãã¯public :;ã§ãªããã°ãªããŸããã
- DL_EXPORTïŒlibãimplïŒã³ã³ã¹ãã©ã¯ããèšè¿°ããŠãé¢æ°ããšã¯ã¹ããŒãããŸãã
äŸãšããŠãDL_LIBRARYèšè¿°ã§å®çŸ©ãããtest1_lib.hppãã¡ã€ã«å
ã®ã€ã³ã¿ãŒãã§ãŒã¹ã®DLLå®è£
ãæ³åããŠãã ããã
DL_INTERFACE
ãã®ãã¯ãã䜿çšãããšãã¯ã©ã¹ã€ã³ã¿ãŒãã§ã€ã¹ãèšè¿°ãããããæäœããã©ãããŒã¯ã©ã¹ããŠãŒã¶ãŒã«æäŸã§ããŸãã ã©ãããŒã¯ã©ã¹ã®å®è£
ã«ãããC ++äŸå€ã®æ£ãã䜿çšãä¿èšŒãããŸãã
-DLLåŽã®C ++äŸå€ã®èªåãã£ããã
-DLLã®å¢çãä»ããŠå€ãè¿ããäŸå€ã®ååšãéç¥ããŸãã
-äŸå€ãDLLã®åŽã§ãã£ãããããå Žåã®æ°ããäŸå€ã®çæïŒäŸå€ã®çš®é¡ã«é¢ãã説æãšæ
å ±ã®åŸ©å
ïŒ
ãã®ãã¯ãã«ãã£ãŠçæãããã©ãããŒã¯ã©ã¹ã¯ããã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ãããªããžã§ã¯ãã®æææš©ãå
±æããŠããŸãã å
±ææææš©ã¯ããªã³ã¯ã«ãŠã³ãã¡ã«ããºã ã«ãã£ãŠæäŸãããŸãã ã©ãããŒã¯ã©ã¹ã®ãªããžã§ã¯ããã³ããŒããå Žåãåç
§ã«ãŠã³ã¿ãŒãå¢ããããã«å
éšé¢æ°ãåŒã³åºãããç Žæ£ãããå Žåãåç
§ã«ãŠã³ã¿ãŒãæžããããã«å
éšé¢æ°ãåŒã³åºãããŸãã ã«ãŠã³ã¿ãŒã0ã«éãããšããªããžã§ã¯ãã¯èªåçã«åé€ãããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã¡ãœãããžã®ã¢ã¯ã»ã¹ã¯ããããä»ã㊠ãŸãã¯ã->ãã
DynLibã©ã€ãã©ãªã¯ãEXEå¢çïŒDLLïŒ<-> DLLã§ã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã®å®å
šãªäœ¿çšãä¿èšŒããŸã DL_INTERFACE( interface_class ) ( ( ret_type, name, arguments ) )
- interface_class -DynLibã©ã€ãã©ãªãçæããå®è£
ãæã€ã¯ã©ã¹ã®ååã
- ã¡ãœãã -ã¯ã©ã¹ã€ã³ã¿ãŒãã§ã€ã¹ãèšè¿°ããé¢æ°ã®åæã
äŸïŒ
DL_NS_BLOCK(( example ) ( DL_INTERFACE( processor ) ( ( int, threads_count, () ) ( void, process, (char const*,buf)(std::size_t,size) ) ) ))
䜿çšæ³ïŒ
example::processor p; p =âŠ
dl ::å
±æ
ãã³ãã¬ãŒãã¯ã©ã¹dl :: shared <T>ã¯ã次ã®åé¡ã解決ããŸãã
- ã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãããåŒæ°ãæã€ã¯ã©ã¹Tã®ãªããžã§ã¯ãã®åçäœæã
- åç
§ã«ãŠã³ã¿ãŒãè¿œå ããŠå
±ææææš©ãæäŸããïŒboostïŒstdïŒ:: shared_ptrãªã©ïŒ;
- DL_INTERFACEãã¯ãã«ãã£ãŠçæãããã¯ã©ã¹ãªããžã§ã¯ããžã®æé»çãªãã£ã¹ãã
ã¯ã©ã¹Tã®ã¡ã³ããŒé¢æ°ãžã®ã¢ã¯ã»ã¹ã¯ãã->ããä»ããŠè¡ãããŸãã
dl ::å
±æã¯ã©ã¹ã¯ãDLLã®å¢çãè¶ããŠæž¡ãããšã¯ã§ããŸãã ã
ã¯ã©ã¹
my_processorãš
äŸ::ããã»ããµã€ã³ã¿ãŒãã§ã€ã¹ããããšããŸãïŒ
class my_processor { public: my_processor( char const* name = "default name" ); int threads_count(); void process(char const* buf, std::size_t size); private:
dl :: sharedã®äœ¿çšäŸã以äžã«ç€ºããŸãã
dl::shared<my_processor> p1( "some processor name" );
dl :: ref
åãã¡ãœããã®ã»ããã䜿çšããŠã
DL_INTERFACEãä»ããŠå®£èšãããã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ã®ãªããžã§ã¯ãã«ä»»æã®ãªããžã§ã¯ãããã£ã¹ãã§ããã©ã€ãã©ãªé¢æ°ã éåžžããã®åäœã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã¯ã©ã¹ãåŒæ°ãšããŠåãåãé¢æ°ãããå Žåã«å¿
èŠã§ãããã¹ã¿ãã¯ã«é
眮ããããªããžã§ã¯ããæž¡ãå¿
èŠããããŸãã
dl :: refé¢æ°ã¯æ³šæããŠäœ¿çšããå¿
èŠããããŸãããã®å Žåãã€ã³ã¿ãŒãã§ãŒã¹ã¯ã©ã¹ã®ãªããžã§ã¯ãã¯è»¢éããããªããžã§ã¯ããææããããŠãŒã¶ãŒã¯ã€ã³ã¿ãŒãã§ãŒã¹ã¯ã©ã¹ãéããŠãªããžã§ã¯ãã®å¯¿åœãšãã®äœ¿çšãå¶åŸ¡ããŸãã
dl :: refãä»ããŠæž¡ããããªããžã§ã¯ããåç
§ããã€ã³ã¿ãŒãã§ãŒã¹ã¯ã©ã¹ã®ãªããžã§ã¯ããã³ããŒããããšã¯èš±å¯ãããŠãããéåžžã«æ£ç¢ºã§ãïŒåç
§ã«ãŠã³ã¿ãŒããªããããå€æŽãããã®ã¯ãããŸãã-ã€ã³ã¿ãŒãã§ãŒã¹ã¯ã©ã¹ã®ãªããžã§ã¯ãã¯ããã§æ£ããåäœããæ¹æ³ãç¥ã£ãŠããŸãïŒã
class my_processor { public: my_processor( char const* name = "default name" ); int threads_count(); void process( char const* buf, std::size_t size ); private:
ãµããŒããããŠããã³ã³ãã€ã©
DynLibã©ã€ãã©ãª
㯠ã次ã®ã³ã³ãã€ã©ïŒéçºç°å¢ïŒ
ãšå®å
šã«äºææ§ããããŸãã
- Microsoft Visual C ++ 2008;
- Microsoft Visual C ++ 2010;
- MinGW GCC 4.5.0以éã
以äžã®ã³ã³ãã€ã©ãŒãšéšåçã«äºææ§ããããŸãïŒéçºç°å¢ïŒïŒ
- CodeGear C ++ Builder XEïŒç¹å®ã®ã³ã³ãã€ã©ãŒèšå®ã§ã¯åäœã¯ä¿èšŒãããŸããïŒ
ããã«å³æžé€šãæã£ãŠ