Problem in using Shared/Static MFC lib in DLL...help
Glenn T. Jayaputera -- gtj@nunkeen.apana.org.au
Tuesday, March 05, 1996
I am wondering if somebody can shed some light to me...
I am using VC4.0 and Win95
Using AppWizard I create a DLL and EXE frameworks.
In my DLL I would like to display a dialog box when show() is called.
However, rather than instantiating my dialong box class on the stack I
would like to use the heap.
Therfore the skeleton code of my dll is as follows
class myDLL : CWinApp {
public:
CMyDlg *m_pDlg;
:
:
};
CMyDll myDLLInstance;
myDLL::InitInstance()
{
m_pDlg = new CMyDlg;
return TRUE;
}
myDLl::ExitInstance()
{
delete m_pDlg;
return 0;
}
extern "C" __declspec(dllexport) void show()
{
myDLLInstance.m_pDlg->DoModal();
}
in my EXE program, I linked the mydll.lib file into it and when the
user click a menu entry I just call this show().
My problem is when both the DLL and EXE are build using "shared MFC DLL", the
dialog box never show up, and when I terminate the program I saw the following
message in my output window
First-chance exception in exe.exe (KERNEL32.DLL): 0xC0000005: Access Violation.
If I build them using "static" or DLL->static and EXE->shared then it
works fine. If I build DLL->shared and EXE->static, it becomes worst,
I got assertion failure as well as the above message in my output
window
Can somebody give me some pointers on this..... I would like to use
shared MFC on both DLL and EXE
thanks in advance
glenn tesla
Randal Parsons -- Randal.Parsons@btal.com.au
Thursday, March 07, 1996
Glenn T. Jayaputera wrote:
>
> I am wondering if somebody can shed some light to me...
> I am using VC4.0 and Win95
>
[snip]
> My problem is when both the DLL and EXE are build using "shared MFC DLL", the
> dialog box never show up, and when I terminate the program I saw the following
> message in my output window
>
> First-chance exception in exe.exe (KERNEL32.DLL): 0xC0000005: Access Violation.
>
> If I build them using "static" or DLL->static and EXE->shared then it
> works fine. If I build DLL->shared and EXE->static, it becomes worst,
> I got assertion failure as well as the above message in my output
> window
>
> Can somebody give me some pointers on this..... I would like to use
> shared MFC on both DLL and EXE
>
We has the same problem here when we ported from VC2.2 to VC4. A colleague at work pointed out that you need to
add the macro AFX_MANAGE_STATE at the beginning of each function you expose that uses MFC.
For example we have a database access DLL that uses the MFC ODBC classes. The functions that only access our
own data structures do not need this macro, but the functions using anything from MFC do. There is an article
in the help file called "Managing the State Data of MFC Modules" that hints at what you have to do.
eg :
__declspec(export) void
funcMFC()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// use MFC classes
}
Unfortunately for us, the default implementation of DllMain (in DLLMODUL.CPP) contains the code :
#ifdef _DEBUG
// check for missing AfxLockTempMap calls
if (AfxGetModuleThreadState()->m_nTempMapLock != 0)
{
TRACE1("Warning: Temp map lock count non-zero (%ld).\n",
AfxGetModuleThreadState()->m_nTempMapLock);
}
AfxLockTempMaps();
AfxUnlockTempMaps();
#endif
Unless it was compiled with _AFX_PORTABLE defined (which is not the default), the code for AfxUnlockTempMaps
(in WINHAND.CPP) assumes that AfxGetApp() returns a non-null pointer. If it doesn't, it tries to access
pApp->m_nSafetyPoolSize and crashes. Since we don't have a main window in our DLL, AfxGetApp() returns NULL. So
I copied most of the code from DLLMODUL.CPP, commenting out the code given above and renaming some of the
functions. This had the added advantage that I could modify DllMain to do some initialisation and cleanup as it
had previously.
If you need more detailed code, I will be happy to send it to you directly.
Regards,
Randal Parsons.
| Вернуться в корень Архива
|