Показать сообщение отдельно
Старый 06.04.2009, 10:51   #9
jimon
 
Сообщений: n/a
Ответ: Взаимодействие С++ и DLL

HolyDel
добавлю про редисты :
сам язык C++ не имеет никаких реализаций контейнеров, функций или чего либо еще, потому нужен код который реализует так сказать "runtime" (в аналогии терминов с blitz3d)
в большинстве случаев ваша программа просто использует код из C Runtime Library (CRT)
даже если у нас есть исходники CRT (микрософт их всё же дает), то они всё равно лежат в скомпилированом виде по нескольким причинам :
1) время компиляции проекта
2) если CRT код одинаков для всех программ которые написаны на этой студии то зачем его таскать с каждой программой ?

именно пункт 2 решает проблему большого минимального exe (другие языки очень любят меряцо - "а у нас минимальный exe в 5 кб ахахаха")

в настройках проекта можно насильно указать что делать - прилинковать статически или использовать системную
но тут еще есть одна очень БОЛЬШАЯ СЛОЖНАЯ особенность

расмотрим пример :
у нас есть program.exe, plugin.dll (plugin.dll линкуется динамически)
program.exe выделяет 100 байт памяти и передает указатель plugin.dll, plugin.dll ети 100 байт удаляет, программа падает, романтика
это происходит когда в program.exe и plugin.dll свои функции для выделения и удаления памяти, тоесть CRT прилинкован к каждой статически
чтобы это исправить используют линковку CRT в виде DLL, тогда получается что в памяти програмы CRT только одно сидит и функции выделения и удаления памяти общие на програму и плагин
(описаная проблема не появляется когда plugin.dll линкуется статически, разве что перемудрить и выкинуть из .lib файла информацию о прилинкованых других либах)
по-этому надо все проекты которые использует ваша програма компилировать или в /MT или в /MD, если одна либа скомпилирована в /MT, а другая в /MD то ваша программа будет играть в романтического котика ходящего по-мосту : упадёт, не упадёт, упадёт ...

ps. Пролетарий ! используй /MT или компилируй конечный продукт в mingw (разработка на msvc, а компиляция конечного продукта на mingw)
ps2. проблему с плагинами еще решают так - делают core.dll в которым определены свои функции выделения и удаления памяти, ваша программа выделяет память с помощью кода из core.dll, а plugin.dll удаляет память тоже с помощью кода из core.dll, при этом при загрузке плагина core.dll будет только одна в памяти программы потому что она раньше уже была загружена
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо за это полезное сообщение:
h1dd3n (06.04.2009), HolyDel (06.04.2009), impersonalis (06.04.2009)