Динамично импортируя класс C++ из DLL

Если вы хотите, чтобы структура имела определенный размер с GCC, например, используйте __attribute__((packed)) .

В Windows вы можете установить выравнивание в один байт при использовании cl .exe компилятор с опцией / Zp .

Обычно ЦП получает доступ к данным, который является кратным 4 (или 8), зависящей от платформы, а также от компилятор.

Итак, это вопрос выравнивания в основном.

У вас должны быть веские причины для его изменения.

13
задан Douglas Leeder 21 September 2008 в 12:16
поделиться

5 ответов

Найденный решением по http://www.codeproject.com/KB/DLL/XDllPt4.aspx

Спасибо за Ваших парней усилий и девочек

5
ответ дан 1 December 2019 в 22:24
поделиться

Я обычно объявляю интерфейсный базовый класс, использую это объявление в моем приложении, затем использую LoadLibrary, GetProcAddress для получения функции фабрики. Фактор всегда возвращает указатель интерфейсного типа.

Вот практический пример, экспортируя документ/представление MFC из DLL, динамично загруженного

2
ответ дан 1 December 2019 в 22:24
поделиться

Необходимо добавить следующее:

extern "C"
{
...
}

избегать функционального искажения.

Вы могли бы рассмотреть запись двух простых функций C:

SomeClass* CreateObjectInstace()
{
    return new SomeClass();
}

void ReleaseObject(SomeClass* someClass)
{
   delete someClass;
}

Только используя те функции можно позже добавить/изменить функциональность создания объекта / удаление. Это иногда называют Фабрикой.

12
ответ дан 1 December 2019 в 22:24
поделиться

Проверьте этот вопрос. В основном существует два пути. Можно отметить класс с помощью _dllexport и затем связаться с библиотекой импорта, и DLL будет загружен автоматически. Или если Вы хотите загрузить DLL динамично сами, можно использовать идею функции фабрики это предложенный @titanae

2
ответ дан 1 December 2019 в 22:24
поделиться

работы dllexport/dllimport, место это перед Вашим именем класса в заголовочном файле и Вы хороши пойти.

Обычно Вы хотите использовать dllexport в dll и dllimport в exe (но можно просто использовать dllexport везде, и он работает, делать правильно его делает его немного быстрее для загрузки).

Очевидно, это для разовой ссылкой компиляции. Можно использовать/delayload директиву компоновщика для создания этого 'динамичным', но это, вероятно, не, что Вы хотите от строки темы.

Если Вы действительно хотите загрузку стиля LoadLibrary, Вы оказываетесь перед необходимостью переносить свои функции C++ с обертками "экстерна C". Проблема из-за искажения имени, Вы могли ввести в полностью-скорректированном-имени, и это будет работать.

Обходные решения должны обычно обеспечивать функцию C, которая возвращает указатель на корректный класс - COM прокладывает себе путь, поскольку это экспортирует 4 функции C из dll, которые используются для получения методов интерфейса в объекте в dll.

1
ответ дан 1 December 2019 в 22:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: