Hi,
The Following sample code causes a crash under WINE, but not in windows.
IUnknown *p
LoadLibrary("mscoree.dll") GetProcAddress("CreateDebuggingInterfaceFromVersion") CreateDebuggingInterfaceFromVersion(..., (void**)&p) <-- Com Reference
FreeLibrary("mscoree.dll")
p->QueryInterface(....); <-- Cause Crash under WINE.
The DLL shouldn't be unloaded since mscoree.DLLCanUnloadNow() return S_FALSE;
Is this a bug with the unloading of DLL's? Is there way to stop the unloading of a DLL?
I know the logic isn't the best, but I'm seeing this type of behavior in an application.
Best Regards Alistair Leslie-Hughes
On Friday 07 October 2011 11:50:17 am Alistair Leslie-Hughes wrote:
Hi,
The Following sample code causes a crash under WINE, but not in windows.
IUnknown *p
LoadLibrary("mscoree.dll") GetProcAddress("CreateDebuggingInterfaceFromVersion") CreateDebuggingInterfaceFromVersion(..., (void**)&p) <-- Com Reference
FreeLibrary("mscoree.dll")
p->QueryInterface(....); <-- Cause Crash under WINE.
The DLL shouldn't be unloaded since mscoree.DLLCanUnloadNow() return S_FALSE;
Is this a bug with the unloading of DLL's? Is there way to stop the unloading of a DLL?
I know the logic isn't the best, but I'm seeing this type of behavior in an application.
Best Regards Alistair Leslie-Hughes
Hi!
It doesn't seem your test is correct. You are not supposed to use LoadLibrary directly but use COM methods that will call FreeLibrary internally when DLLCanUnloadNow returns true.
The fact it doesn't crash on Windows is probably caused by mscoree.dll being kept loaded by some other components. I don't know, maybe on Windows mscoree is never unloaded - this can be verified easily.
If there are actually programs that crash that way because they depend on the Windows behavior we can work around by making internally a LoadLibrary call when the first object is created and a FreeLibrary call after the last object is destroyed.
Paul