poco icon indicating copy to clipboard operation
poco copied to clipboard

Poco::ClassLoader will crashed when DLL and EXE not use MD/MDd RunTime-Library

Open siren186 opened this issue 1 year ago • 7 comments

Describe the bug Poco::Manifest class has STL member, It will crash if DLL and EXE use different Run-Time Library (MT/MD)

To Reproduce Build options: VS2019 + debug_static_mt + x64 ( It must be in debug mode and not MD if you wanna see the crash message box)

EXE code

#include "DLLTest/AbstractPlugin.h"

int wmain(int argc, wchar_t** argv)
{
    Poco::ClassLoader<AbstractPlugin> loader;
    loader.loadLibrary("Test.dll");
    AbstractPlugin* pPluginA = loader.create("PluginA");
    AbstractPlugin* pPluginB = loader.create("PluginB");

    loader.classFor("PluginA").autoDelete(pPluginA);
    delete pPluginB;
    loader.unloadLibrary("Test.dll");
}

DLL code

class AbstractPlugin
{
public:
    virtual ~AbstractPlugin() {};
    virtual void foo() const = 0;
};

class PluginA : public AbstractPlugin
{
public:
    virtual void foo() const override
    {
    }
};

class PluginB : public AbstractPlugin
{
public:
    virtual void foo() const override
    {
    }
};

POCO_BEGIN_MANIFEST(AbstractPlugin)
POCO_EXPORT_CLASS(PluginA)
POCO_EXPORT_CLASS(PluginB)
POCO_END_MANIFEST

Screenshots PocoCrash

Please add relevant environment information:

  • Windows 10
  • POCO-1.13.2

siren186 avatar May 08 '24 07:05 siren186

You are not supposed to use different runtime libraries in your main application and your plugins.

obiltschnig avatar May 08 '24 07:05 obiltschnig

If I use MT to build DLL and EXE, it will crash, Because the STL container are malloc in DLL, but free in EXE

siren186 avatar May 08 '24 07:05 siren186

That's an unfortunate side effect of using MT with DLLs. Nothing we can do about it.

obiltschnig avatar May 08 '24 08:05 obiltschnig

What about hiding the implementation of Poco::Manifest::insert and Poco::Manifest::clear, to make sure who new, who delete, then it will not crash anymore.

siren186 avatar May 08 '24 08:05 siren186

What about hiding the implementation of Poco::Manifest::insert and Poco::Manifest::clear, to make sure who new, who delete, then it will not crash anymore.

That can't be done. Manifest is a templated class.

andrewauclair avatar May 11 '24 15:05 andrewauclair

That can't be done. Manifest is a templated class.

I wanna use POCO with CEF3 (https://github.com/chromiumembedded/cef), But my CEF3 applications are building with MT. I am using use my own plugin loader (https://github.com/siren186/z_com), It can work with different MT/MDs. Now I wanna use POCO to instead, But it seems impossible

siren186 avatar May 13 '24 01:05 siren186