
Hello, I have a weird access violation when using boost::function which is passed from one DLL to another. At work we use an engine that loads libraries at runtime. One of those libraries provides a class, that looks like that: class CLib { public: LIB_API CLib(void); typedef boost::function<void ()> Func; LIB_API void virtual Invoke(Func * func); }; Another library tries to make use of this lib by void freedummy() { int x = 0; } CLib::Func f = freedummy; f(); // testinvoke locally c.Invoke(&f); // passing to dll The invocation fails hard with Visual Studio 2008 SP1 (Windows 7 64bit, application as 32 bit) when passing to the other dll. The result is a call to a function address that points to nomans-land (c.Invoke()), whereas the direct f() call invokes the freedummy correctly. I have tried to create a very basic reproducer for this case and I could not make it crash. I tried to track down the execution of freedummy in the disassembler. The f-Pointer remains the same all the time but when boost::function0<void>::operator()() gets called on the lib the ptr to f remains correct but the inner function_ptr pointing to freedummy gets corrupted and pointing into garbage. Since I could NOT reproduce it with a simple test setup and I actually am not very sure why this fails I am a bit out of ideas. Can there be somehow a misalignment or different assembler (The dlls may have been compiled with different settings, not sure). I just remembered that this line: vtable_type* get_vtable() const { return reinterpret_cast<vtable_type*>( reinterpret_cast<std::size_t>(vtable) & ~static_cast<size_t>(0x01)); } (in function_template.hpp on 678) looked different in the disassembler when called f() in the main executable compared to the invocation in CLib in the external dll. Can I somehow get a better grip on what's happening? My assembler is not that strong that I could understand all those calls when journeying down the boost call stack. Any hint appreciated, Sam -- Empfehlen Sie GMX DSL Ihren Freunden und Bekannten und wir belohnen Sie mit bis zu 50,- Euro! https://freundschaftswerbung.gmx.de