Здравствуйте, Pavel Dvorkin, Вы писали:
PD> ·>Классы в dll? Гы, такой гемор. Обычно из юзабельного только extern "C".
PD> Да нет, ничего особенного. Вполне можно использовать.
Можно, но только когда у тебя один большой проект, собирается одной версией компилятора с идентичным списком ключей. И то тебе придётся преобразовывать std::string в CString из BSTR и ещё хз чего. В случае плагинов, как у топикстартера, когда dll-и приходят из разных источников от разных вендоров, то упс.
PD> Собственно говоря, класс есть класс независимо от того, лежит он в EXE или DLL
PD> А как, собственно, делать иначе, если некий класс нужен в нескольких project из этого solution ? Дублировать его ?
Если нужен реюзабельный компонент, то оборачивать в extern "C".
PD> ·>Я не знаю что может означать "jar загружается". Есть classpath — места где ищутся классы. И это вовсе не обязательно должны быть jar (который просто обычный zip-архив). Классы могут грузится и из обычной директории, из на лету сгенерённого массива байтов и даже из сети.
PD> Означать может просто "подключить все классы из этого архива".
Что значит "подключить класс"?
PD> Иными словами, сделать то же самое, что делается при прописывании dependency на него в pom.xml. Только в рантайме, а не статически.
Ну так и с dll — всё так же. При запуске приолжения dll-ки времени сборки проекта подгружаются так же как обычно и jar-ки в pom.xml. А динамической подгрузкой надо звать LoadLibrary и GetProcAddress и мучиться с источниками. Всё то же, всё так же.
PD> Так же как LoadLibrary означает "загрузить все, что в ней есть"
Под "загрузить" ты, наверное, имеешь в виду "вызвать DllMain". Потом всё равно придётся выковыривать части по строковым именам используя GetProcAddress.
LoadLibrary — соответсвует new ClassLoader, а GetProcAddress — loadClass().
PD> ·>В качестве аналогии можно сказать так: dll — соответсвует java-классу, а jar — это LD_LIBRARY_PATH. Вот и попробуй представь что может означать "загрузка LD_LIBRARY_PATH".
PD> Ну даже чисто формально DLL не есть один класс (или namespace), а целая коллекция средств — например, WinSock или GDI. Ты же не скажешь, что GDI32.DLL — это один класс ?
PD> И уж в любом случае это один файл, а не path
Ну я же говорю, что это
аналогия, а не точное соответствие.
ClassLoader позволяет хитрые манипуляции, полностью контролируя загрузку каждого класса. Примерно как допустим ты дёргаешь функцию в GDI32, а это что-то где-то внутре хочет дёрнуть другую функцию, а твой кастомный ClassLoader может взять его из другого места или даже пропатчить байткод на лету.