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