C ++ классы плохо пересекают границы DLL. DLL и EXE должны быть собраны с одинаковыми компилятором и версией - желательно вместе. Это связано с тем, что особенности реализации класса, такие как vtbl
макет / порядок, а также реализации некоторых стандартных функций библиотеки (т. Е. std::string
различия) не являются переносимыми. Различные схемы компиляции имен компиляторов также не доступны между компиляторами / версиями. Единственный интерфейс, который вы можете надежно представить за пределами DLL, - это интерфейс C.
Поскольку я не знаю точного сценария здесь, я не уверен, но вы, вероятно, вызываете какой-то тип неопределенного поведения через границу DLL.
РЕДАКТИРОВАТЬ: также возможно, что DLL был выгружен в какой-то момент в результате вызова несуществующего кода в B.