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