Почему созданная в C++ Builder 10.3 dll при динамической загрузке в exe, созданному в VisualStudio 19, не выполняет код DllMain?
Dll написана и скомпилирована в С++ Builder 10.3 и включает в себя объекты Indy 10. Indy 10 написана на Delphi и содержит раздел initialization, в котором создается CriticalSection. При динамической загрузке в exe, созданном в С++ Builder, инициализация dll проходит корректно: выполняется код в разделе initialization, соответственно создается объект CriticalSection. Также выполняется код и в DllMain.
Если же динамически подгрузить ту же dll в exe, созданный в Visual Studio 19, то код в разделе initialization не выполняется. Что при обращении к не созданному объекту CriticalSection в последующем коде вызывает AV. Также не выполняется код и в DllMain.
_libmain, которую автоматически создает C++ Builder в dll была заменена на DllMain. Результат тот же: exe от C++ Builder в нее заходит, а exe от VS нет. Что можете порекомендовать?
Дополнение: если создать проект простого консольного приложения в VS с нуля и динамически подключить dll, то все разделы инициализации dll выполняются корректно. В проекте VS, по которому задан вопрос, exe загружает плагин, а уже плагин подгружает dll. Может проблема где-то в настройках проекта VS?
Есть много вещей, делать которые в DllMain, - это плохая идея. Например: динамическая загрузка других библиотек, создание процессов и потоков, инициализация COM и многое другое.
Подробнее по ссылке на MSDN: https://docs.microsoft.com/en-us/windows/win32/dll...
Все, что мне удалось - это подгрузить отладочные символы библиотеки в VS, да и то "В файле символов отсутствует информация о типах". (использовал конвертер cv2pdb.exe) Если есть возможность полной отладки в VS dll, созданной в C++ Builder, то прошу подсказать, где с эти можно ознакомиться.
Косвенно могу ответить на рекомендацию запустить отладку dll в VS так: если закоментировать код создания объекта Indy 10, то объект CriticalSection не требуется и ошибки AV не возникает. Если оставить всё как есть, то AV.