Unable to deserialize classes from dll (Extension Dll)
Sathiyamurthy Thiruvengadathan -- sathiya@colmds2.com Tuesday, March 18, 1997 Environment: MSVC 4.2b Windows NT 4.0 Hi, I had a bunch of CObject derived classes exported from a DLL. This DLL was built with "Use MFC in a Static Library" option. Some of these classes had serialisation/deserialisation functioniality and they were working fine. For certain reasons I had to change the build settings to "use MFC in a shared DLL" option. After this change everything else works fine, but the deserialisation doesn't work. Debugging thru the MFC source I figured out that I'm not getting the CRuntimeClasses for the classes defined in the DLL. The CRuntimeClass::Load() function fails and returns NULL. After reading MFC Tech Notes - TN033 - I realised what the problem is and I added the following DllMain function (till then the DLL did not have one) as suggested. static AFX_EXTENSION_MODULE NEAR extensionDLL = { NULL, NULL }; extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { if (dwReason == DLL_PROCESS_ATTACH) { if (!AfxInitExtensionModule(extensionDLL, hInstance)) return 0; new CDynLinkLibrary(extensionDLL); } return 1; } Even after adding this function, though the function gets executed and AfxInitExtensionModule returns TRUE, CRuntimeClass::Load() cannot find the CRuntimeClasses of the classes defined in the DLL. I checked up the DLLHUSK sample to see if I need to do anything more. But I couldn't figure out. Can somebody tell me what is that I am doing wrong? I would appreciate any help in this regard. I have a deadline staring at me. Thanks in advance. Sathya sathiya@colmds2.com
Doug Brubacher -- Doug_Brubacher@compuware.com Saturday, March 22, 1997 Give AFX_MANAGE_STATE( AfxGetStaticModuleState() ); a try. It should be the first line in any entry point into your DLL. This is definitely a necessity when accessing resources, and may resolve the problem you are reporting as well. See the documentation: Regular DLLs Dynamically Linked to MFCBecause this kind of DLL uses the dynamic link library version of MFC, you must explicitly set the current module state to the one for the DLL. To do this, use the AFX_MANAGE_STATE macro at the beginning of every function exported from the DLL. Regards, Doug Brubacher Doug_Brubacher@compuware.com
Sathiyamurthy Thiruvengadathan -- sathiya@colmds2.com Tuesday, March 25, 1997 Doug Brubacher wrote: > > Give > AFX_MANAGE_STATE( AfxGetStaticModuleState() ); > a try. It should be the first line in any entry point into your DLL. > This is definitely a necessity when accessing resources, and may > resolve the problem you are reporting as well. > > See the documentation: > Regular DLLs Dynamically Linked to MFC > >> Because this kind of DLL uses the dynamic link library version of MFC, > you must explicitly set the current module state to the one for the > DLL. To do this, use the AFX_MANAGE_STATE macro at the beginning of > every function exported from the DLL. > > Regards, > > Doug Brubacher > Doug_Brubacher@compuware.com Thanks Doug, it did work. I just added AFX_MANAGE_STATE macro at the beginning of my Serialize function and everything works fine. Tho' the documentation says that I need to instantiate a CDynLinkLibrary object in my DLL initialisation function, I didn't do that (b'cos I was getting linker errors if I use CDynLinkLibrary and AFX_MANAGE_STATE in the same DLL) and everything works fine. Thanks once again Doug, Sathya
Become an MFC-L member | Вернуться в корень Архива |