AW: WG: AW: [Acdk-developer] Compiling problem
Brought to you by:
kommer
From: Roger R. K. <ko...@ar...> - 2005-06-14 07:31:23
|
Hi, >> I have the following principle question: in case that we would like to load some class dynamically through class name and in case that this class is not included in our EXEcutable file because of compilator optimization how can we load this class? << First you have to put your classes into a DLL. The name of the DLL has to reflect the namespace of your classes (like com::company::mylib::MyClass should reside in com_company_mylib_d.dll). Also add metainfo/extended RTTI to your classes using the acdkmc compiler. After compiling it, put the library into the ACDKHOME/bin path, so that the classloader can find the DLL. Please refer also to: http://acdk.sourceforge.net/acdk/docs/hb/lang/acdk_hb_mi_nameservice.html To look, if your classes can be accessed via dynamic loading and invokation You can also make use of the CfgScript language: http://acdk.sourceforge.net/acdk/modules/acdk_core/docs/acdk_cfgscript_hb.ht ml To access the classes dynamically from C++ you have two possiblities: Using Weak invokation: http://acdk.sourceforge.net/acdk/docs/hb/lang/acdk_hb_dmi_basics.html#Dynami c%20Method%20Invokation%20(DMI) http://acdk.sourceforge.net/acdk/docs/hb/lang/acdk_hb_dmi_use_cpp.html The second possibilty to access your classes in a native C++ way is To use an interface library. Therefore you have to split you C++ classes in a interface part (http://acdk.sourceforge.net/acdk/docs/hb/lang/acdk_hb_types_interfaces.html ) and an implementation part. The implementation part implements the interfaces. For both interface and implementation library, generate metainfo with acdkmc. The interfaces classes are in one library, which has to be linked to the The executable. The implementation classes are in another library, which can be loaded at runtime: MyInterface is an interface known by the executable. MyClass implements the interface MyInterface, but will loaded at runtime: RMyInterface iface = (RMyInterface)Class::forName("com::company::mylib::implementation::MyClass") .newInstance(); RString s = Iface->callMethod("asdf", 42); The advantage of this method is, that you can access the methods in a type safe way. Hope this helps, Roger |