在我的情况下,我编写了一个Kernel.dll
,它包装了xImage.dll
中定义的CxImage对象(CxImageJPG或CxImage),该对象与其他二进制模块共享(无源代码):
class CCxImageWraper{
public:
shared_ptr<CxImage> m_spImage;
...
}
当我使用dynamic_cast时,它失败并出现std::__non_rtti_object
异常:
m_spImage.reset(new CxImageJPG); // always std::__non_rtti_object exception
CxImageJPG* cxJpgImage = dynamic_cast<CxImageJPG*>(m_spImage.get());
我确信kernal.dll
项目使用选项/GR (Enable Run-Time Type Information)
,并且这里的指针m_spImage.get()
不是NULL,它肯定指向CxImageJPG
instatance。 不知道为什么抛出std :: __ non_rtti_object我遗失了哪些信息?
我尝试创建新的控制台项目Test.exe
和TestDll.dll
,Test.exe
始终打开GR
切换,TestDll.dll
有两个类:{{1 }},BaseClass
,我设置为SubClass
的任何选项:TestDll.dll
或/GR
,/GR-
或/MT
或/MDd
。 Test.exe始终可以dynamic_cast /MTd
中定义的对象:
TestDll.dll
已经检查过问题,但无法找到有关我的问题的更多信息: