Compartilhar via


Comportamento de biblioteca de tempo de execução

O C/C++ código de biblioteca de tempo de execução executa a seqüência de inicialização da DLL, eliminando a necessidade de vínculo com um módulo separado como era necessário no Windows 3. x.Incluído no C/C++ de código de biblioteca de tempo de execução é a função de ponto de entrada DLL chamada _DllMainCRTStartup.O _DllMainCRTStartup função faz várias coisas, inclusive a chamada _CRT_INIT, que inicializa a biblioteca de tempo de execução do C/C++ e chamar construtores de C++ em variáveis estáticas e não local.Sem essa função, a biblioteca de tempo de execução seria deixada em um estado não inicializado._CRT_INIT está disponível para um CRT vinculado estaticamente ou vinculação a Msvcr90.dll de DLL CRT, de um usuário DLL.

Embora seja possível especificar outra função de ponto de entrada usando o /ENTRY: opção de vinculador, não é recomendável porque sua função de ponto de entrada teria que duplicar tudo que _DllMainCRTStartup oferece.Ao criar DLLs no Visual C++, _DllMainCRTStartup é vinculado automaticamente e você não precisa especificar uma função de ponto de entrada usando o /ENTRY: opção de vinculador.

Além de para inicializar a biblioteca de tempo de execução C, _DllMainCRTStartup chama uma função chamada DllMain.Dependendo do tipo de DLL que você está criando, Visual C++ fornece DllMain para você e ele obtém vinculados para que _DllMainCRTStartup sempre tem algo para chamar.Dessa forma, se você precisar inicializar sua DLL, não há nada de especial que você precisa fazer ao criar sua DLL.Se você precisar inicializar sua DLL, onde você adicionar que seu código depende do tipo de DLL que você está escrevendo.Para obter mais informações, consulte inicializar uma DLL.

O código de biblioteca de tempo de execução do C/C++ chama construtores e destrutores variáveis estáticas e não local.Por exemplo, no seguinte código-fonte da DLL, Equus e Sugar dois objetos estáticos, não-local da classe CHorse, definido em Horses.h.Não há nenhuma função no código-fonte que contém chamadas para uma função de construtor para CHorse ou o destruidor funcionar porque esses objetos são definidos fora de qualquer função.Portanto, chamadas para esses construtores e destrutores devem ser executadas pelo código de tempo de execução.O código de biblioteca de tempo de execução de aplicativos também executa essa função.

#include "horses.h"

CHorse  Equus( ARABIAN, MALE );
CHorse  Sugar( THOROUGHBRED, FEMALE );

BOOL    WINAPI   DllMain (HANDLE hInst, 
                            ULONG ul_reason_for_call,
                            LPVOID lpReserved)
...

Cada vez que um novo processo tenta usar a DLL, o sistema operacional cria uma cópia separada dos dados da DLL: isso é chamado de processo de anexar.O código da biblioteca de tempo de execução para a DLL chama os construtores para todos os objetos globais, se houver e chama o DllMain função com processo de anexar selecionadas.A situação oposta é o processo desanexar: as chamadas de código de biblioteca de tempo de execução DllMain com processo desanexar selecionado e, em seguida, chama uma lista de funções de terminação, incluindo atexit funções, destruidores para objetos globais e destruidores para objetos estáticos.Observe que a ordem dos eventos no processo de anexar é desanexar o inverso do que no processo.

O código da biblioteca de tempo de execução também é chamado durante thread anexar e desanexar do thread, mas o código de tempo de execução não não inicialização ou encerramento por conta própria.

O que você deseja fazer?

Consulte também

Conceitos

DLLs no Visual C++