Dela via


Modultillstånd för en vanlig MFC DLL dynamiskt länkad till MFC

Möjligheten att dynamiskt länka en vanlig MFC DLL till MFC DLL tillåter vissa konfigurationer som är mycket komplicerade. Till exempel kan en vanlig MFC DLL och den körbara filen som använder den både dynamiskt länka till MFC DLL och till eventuella DLL:er för MFC-tillägg.

Den här konfigurationen utgör ett problem när det gäller globala MFC-data, till exempel pekaren till det aktuella CWinApp objektet och hanterar kartor.

Före MFC version 4.0 fanns dessa globala data i själva MFC DLL och delades av alla moduler i processen. Eftersom varje process med en Win32 DLL får en egen kopia av DLL:ets data, gav det här schemat ett enkelt sätt att spåra data per process. Eftersom AFXDLL-modellen antog att det bara skulle finnas ett CWinApp objekt och endast en uppsättning referenskartor i processen, kunde dessa objekt spåras i själva MFC DLL.

Men med möjligheten att dynamiskt länka en vanlig MFC-DLL till den MFC-DLL, är det nu möjligt att ha två eller flera CWinApp objekt i en process - och även två eller flera uppsättningar av handtagskartor. Hur håller MFC reda på vilka som ska användas?

Lösningen är att ge varje modul (program eller vanlig MFC DLL) en egen kopia av den här globala tillståndsinformationen. Därför returnerar ett anrop till AfxGetApp i den vanliga MFC DLL-filen en pekare till CWinApp objektet i DLL:en, inte den i den körbara filen. Den här kopian per modul av globala MFC-data kallas för modultillstånd och beskrivs i MFC Tech Note 58.

Den vanliga MFC-fönsterproceduren växlar automatiskt till rätt modultillstånd, så du behöver inte bekymra dig om det i några meddelandehanterare som implementeras i din vanliga MFC DLL. Men när ditt körbara program anropar den vanliga MFC-DLL:en, måste du uttryckligen ställa in det aktuella modultillståndet till det för DLL-filen. Det gör du genom att använda AFX_MANAGE_STATE makrot i varje funktion som exporteras från DLL:en. Detta görs genom att lägga till följande kodrad i början av funktioner som exporteras från DLL:en:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

Vad vill du veta mer om?

Se även

Skapa DLL:er för C/C++ i Visual Studio