No, the default constructor of std::locale gives you the "C" locale while the "" constructor gives you the system default (e.g. "en_US"). This is a problem. Also, if the catch was executed, everything would work fine, but it appears to never be executed at all.
I'm not sure about the limitations of exception throwing in a dll, however. Might this be the reason it doesn't work?