Versões de biblioteca MFC

A Biblioteca MFC está disponível em versões que dão suporte a código MBCS (conjunto de caracteres multibyte) e de byte único ANSI, bem como versões que dão suporte a Unicode (codificado como UTF-16LE, o conjunto de caracteres nativo do Windows). Cada versão do MFC está disponível como uma biblioteca estática ou como uma DLL compartilhada. Também há uma versão menor da biblioteca estática MFC que deixa de fora controles MFC para caixas de diálogo, para aplicativos que são muito sensíveis ao tamanho e não precisam desses controles. As bibliotecas MFC estão disponíveis nas versões de depuração e versão para arquiteturas com suporte, que incluem processadores x86, x64 e ARM. Você pode criar aplicativos (arquivos .exe) e DLLs com qualquer versão das bibliotecas MFC. Também há um conjunto de bibliotecas MFC compiladas para fazer a interface com o código gerenciado. As DLLs compartilhadas do MFC incluem um número de versão para indicar a compatibilidade binária da biblioteca.

Vinculação automática das versões da biblioteca MFC

Os arquivos de cabeçalho do MFC determinam automaticamente a versão correta da biblioteca MFC a ser vinculada, com base nos valores definidos em seu ambiente de build. Os arquivos de cabeçalho do MFC adicionam diretivas de compilador instruindo o vinculador a vincular em uma versão específica da biblioteca MFC.

Por exemplo, o arquivo de cabeçalho AFX.H instrui o vinculador a vincular a versão da DLL estática completa, estática limitada ou compartilhada do MFC; a versão ANSI/MBCS ou Unicode; e a versão de depuração ou de varejo, dependendo da configuração de build:

#ifndef _AFXDLL
    #ifdef _AFX_NO_MFC_CONTROLS_IN_DIALOGS
        #ifdef _DEBUG
            #pragma comment(lib, "afxnmcdd.lib")
        #else
            #pragma comment(lib, "afxnmcd.lib")
        #endif
        #pragma comment(linker, "/include:__afxNoMFCControlSupportInDialogs")
        #pragma comment(linker, "/include:__afxNoMFCControlContainerInDialogs")
    #endif
    #ifndef _UNICODE
        #ifdef _DEBUG
            #pragma comment(lib, "nafxcwd.lib")
        #else
            #pragma comment(lib, "nafxcw.lib")
        #endif
    #else
        #ifdef _DEBUG
            #pragma comment(lib, "uafxcwd.lib")
        #else
            #pragma comment(lib, "uafxcw.lib")
        #endif
    #endif
#else
    #ifndef _UNICODE
        #ifdef _DEBUG
            #pragma comment(lib, "mfc" _MFC_FILENAME_VER "d.lib")
            #pragma comment(lib, "mfcs" _MFC_FILENAME_VER "d.lib")
        #else
            #pragma comment(lib, "mfc" _MFC_FILENAME_VER ".lib")
            #pragma comment(lib, "mfcs" _MFC_FILENAME_VER ".lib")
        #endif
    #else
        #ifdef _DEBUG
            #pragma comment(lib, "mfc" _MFC_FILENAME_VER "ud.lib")
            #pragma comment(lib, "mfcs" _MFC_FILENAME_VER "ud.lib")
        #else
            #pragma comment(lib, "mfc" _MFC_FILENAME_VER "u.lib")
            #pragma comment(lib, "mfcs" _MFC_FILENAME_VER "u.lib")
        #endif
    #endif
#endif

Os arquivos de cabeçalho do MFC também incluem diretivas para vincular em todas as bibliotecas necessárias, incluindo bibliotecas MFC, bibliotecas Win32, bibliotecas OLE, bibliotecas OLE criadas com base em exemplos, bibliotecas ODBC e assim por diante.

ANSI, MBCS e Unicode

As versões da biblioteca ANSI/MBCS do MFC dão suporte a conjuntos de caracteres de byte único, como ASCII, e conjuntos de caracteres multibyte, como Shift-JIS. As versões da biblioteca Unicode do MFC dão suporte ao Unicode em seu formato codificado em caracteres largos UTF-16LE. Use as versões de biblioteca ANSI/MBCS do MFC para dar suporte a Unicode codificado em UTF-8.

Para definir a configuração do projeto para usar o suporte para caracteres e cadeias de caracteres Unicode de byte único, multibyte ou de caractere largo no IDE, use a caixa de diálogo Propriedades do Projeto. Na páginaPropriedades de Configuração>Geral, defina a propriedade Conjunto de Caracteres como Não Definido para usar um conjunto de caracteres de byte único. Defina a propriedade como Usar Conjunto de Caracteres Multibyte para usar um conjunto de caracteres multibyte ou como Usar Conjunto de Caracteres Unicode para usar Unicode codificado como UTF-16.

Os projetos do MFC usam o símbolo de pré-processador _UNICODE para indicar o suporte para Unicode de caracteres largos UTF-16 e _MBCS para indicar o suporte para MBCS. Estas opções são mutualmente exclusivas em um projeto.

Convenções de nomenclatura da biblioteca estática do MFC

As bibliotecas estáticas do MFC usam as convenções de nomenclatura a seguir. Os nomes de biblioteca têm o formato

uAFXcd.LIB

em que as letras mostradas em letras minúsculas em itálico são espaços reservados para especificadores cujos significados são mostrados na seguinte tabela:

Especificador Valores e significados
u ANSI/MBCS (N) ou Unicode (U); omitir para versão sem controles MFC em caixas de diálogo
c Versão com controles MFC em caixas de diálogo (CW) ou sem (NMCD)
d Depuração ou Versão: D=Depuração; omitir especificador para Versão

Todas as bibliotecas listadas na tabela a seguir são incluídas predefinidas no diretório \atlmfc\lib para arquiteturas de build com suporte.

Biblioteca Descrição
NAFXCW.LIB Biblioteca de link estático MFC, versão
NAFXCWD.LIB Biblioteca de link estático MFC, depuração
UAFXCW.LIB Biblioteca de link estático MFC com suporte para Unicode, versão
UAFXCWD.LIB Biblioteca de link estático MFC com suporte para Unicode, depuração
AFXNMCD.LIB Biblioteca de link estático MFC sem controles de caixa de diálogo MFC, versão
AFXNMCDD.LIB Biblioteca de link estático MFC sem controles de caixa de diálogo MFC, depuração

Arquivos de depurador que têm o mesmo nome base e uma extensão .pdb também estão disponíveis para cada uma das bibliotecas estáticas.

Convenções de nomenclatura de DLL compartilhada do MFC

As DLLs compartilhadas do MFC também seguem uma convenção de nomenclatura estruturada. Isso torna mais fácil saber qual DLL ou biblioteca você deve usar para qual finalidade.

As DLLs do MFC têm números de versão que indicam a compatibilidade binária. Use DLLs do MFC que tenham a mesma versão que suas outras bibliotecas e conjuntos de ferramentas do compilador para garantir a compatibilidade dentro de um projeto.

DLL Descrição
MFCversão.DLL DLL MFC, ANSI ou MBCS, versão
MFCversãoU.DLL DLL do MFC, Unicode, versão
MFCversãoD.DLL DLL MFC, ANSI ou MBCS, depuração
MFCversãoUD.DLL DLL MFC, Unicode, depuração
MFCMversão.DLL DLL MFC com controles do Windows Forms, ANSI ou MBCS, versão
MFCMversãoU.DLL DLL MFC com controles do Windows Forms, Unicode, versão
MFCMversãoD.DLL DLL MFC com controles do Windows Forms, ANSI ou MBCS, depuração
MFCMversãoUD.DLL DLL MFC com controles do Windows Forms, Unicode, depuração

As bibliotecas de importação necessárias para compilar aplicativos ou DLLs de extensão do MFC que usam essas DLLs compartilhadas têm o mesmo nome base que a DLL, mas têm uma extensão de nome de arquivo .lib. Quando você usa as DLLs compartilhadas, uma pequena biblioteca estática ainda precisa estar vinculada ao seu código. Essa biblioteca é chamada de MFCSversão{U}{D}.lib.

Se você estiver vinculando dinamicamente à versão de DLL compartilhada do MFC, seja de um aplicativo ou de uma DLL de extensão do MFC, precisará incluir a MFCversão.DLL ou a MFCversãoU.DLL correspondente ao implantar seu produto.

Para obter uma lista de DLLs do Visual C++ que podem ser distribuídas com seus aplicativos, consulte Código distribuível para o Microsoft Visual Studio 2017 e o SDK do Microsoft Visual Studio 2017 (inclui utilitários e arquivos BuildServer) ou Código distribuível para o Visual Studio 2019.

Para obter mais informações sobre o suporte para MBCS e Unicode no MFC, consulte Suporte para Unicode e conjunto de caracteres multibyte (MBCS).

Você pode usar as bibliotecas MFC dinâmicas estáticas ou compartilhadas para criar DLLs que podem ser usadas por executáveis do MFC e que não são do MFC. Elas são chamadas de "DLLs regulares" ou "DLLs MFC regulares", para distingui-las das DLLs de extensão do MFC que só podem ser usadas por aplicativos MFC e DLLs MFC. Uma DLL criada usando as bibliotecas estáticas MFC às vezes é chamada de USRDLL em referências mais antigas, porque projetos de DLL MFC definem o símbolo de pré-processador _USRDLL. Uma DLL que usa as DLLs compartilhadas do MFC às vezes é chamada de AFXDLL em referências mais antigas, pois define o símbolo de pré-processador _AFXDLL.

Quando você cria seu projeto de DLL vinculando às bibliotecas estáticas MFC, sua DLL pode ser implantada sem as DLLs compartilhadas do MFC. Quando o projeto de DLL é vinculado às bibliotecas de importação MFCversão. LIB ou MFCversãoU.LIB, você precisa implantar a DLL compartilhada do MFC MFCversão.DLL ou MFCversãoU.DLL junto com sua DLL. Para obter mais informações, consulte DLLs.

Confira também

Tópicos gerais do MFC