Как правильно импортировать класс C++ из библиотеки DLL? Мы используем Visual C++.
Есть тройка dllexport / exports.def + LoadLibrary + GetProcAddress, но она не работает с классами C++, а работает только с функциями C. Это связано с изменением имен C++? Как мне заставить это работать?





Обычно я объявляю базовый класс интерфейса, использую это объявление в своем приложении, а затем использую LoadLibrary, GetProcAddress для получения фабричной функции. Фактор всегда возвращает указатель типа интерфейса.
Вот практический пример, экспорт документа / представления MFC из библиотеки DLL, динамически загружаемый
dllexport / dllimport работает, поместите его перед именем класса в файле заголовка, и все готово.
Обычно вы хотите использовать dllexport в dll и dllimport в exe (но вы можете просто использовать dllexport везде, и он работает, если сделать это «правильно», он будет загружаться немного быстрее).
Очевидно, это для компиляции во время компоновки. Вы можете использовать директиву компоновщика / delayload, чтобы сделать его «динамическим», но, вероятно, это не то, что вы хотите от темы.
Если вам действительно нужна загрузка в стиле LoadLibrary, вам придется обернуть свои функции C++ оболочками "extern C". Проблема в том, что из-за искажения имени вы можете ввести полностью искаженное имя, и оно сработает.
Как правило, обходные пути заключаются в предоставлении функции C, которая возвращает указатель на правильный класс - COM работает таким образом, поскольку он экспортирует 4 функции C из dll, которые используются для получения методов интерфейса внутри объекта в dll.
Вам необходимо добавить следующее:
extern "C"
{
...
}
чтобы избежать искажения функций.
вы можете подумать о написании двух простых функций C:
SomeClass* CreateObjectInstace()
{
return new SomeClass();
}
void ReleaseObject(SomeClass* someClass)
{
delete someClass;
}
Используя только эти функции, вы можете впоследствии добавить / изменить функциональность создания / удаления вашего объекта. Иногда это называют фабрикой.
Нашел решение на http://www.codeproject.com/KB/DLL/XDllPt4.aspx
Спасибо за ваши старания, парни и девушки
Проверьте этот вопрос. В принципе, есть два пути. Вы можете пометить класс с помощью _dllexport, а затем связать его с библиотекой импорта, и DLL будет загружена автоматически. Или, если вы хотите динамически загружать DLL, вы можете использовать идею фабричной функции, предложенную @titanae.
Разве эти имена
SomeClassне должны иметь звездочки (т.е. быть указателями наSomeClass)?