|
Boost Users : |
Subject: [Boost-users] boost::function and cross dll call issue
From: ariasgore_at_[hidden]
Date: 2012-05-04 13:55:23
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
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net