Partilhar via


Comportamento de biblioteca de tempo de execução

O C/C++ código da biblioteca de tempo de execução executa a seqüência de inicialização da DLL, eliminando a necessidade de vincular-se com um módulo separado, como era necessário no Windows 3. x. Incluído no C/C++ de código da biblioteca de tempo de execução é a função de ponto de entrada DLL denominada _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 invoca os 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 a 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 ela obtém vinculados para que _DllMainCRTStartup sempre tem algo a chamada. Dessa forma, se você não precisará inicializar sua DLL, há nada de especial, que você deve fazer quando estiver criando sua DLL. Se você precisar inicializar sua DLL, onde adicionar o 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 são os 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 de uma função de construtor para CHorse ou o destruidor funcionar porque esses objetos estão definidos fora da função. Portanto, as chamadas para esses construtores e destrutores devem ser executadas pelo código de tempo de execução. O código da biblioteca de tempo de execução de aplicativos também realiza 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 do 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 anexe a função com o processo selecionado. A situação oposta é um processo desanexar: as chamadas de código da biblioteca de tempo de execução DllMain processo desanexar selecionada 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 é o oposto do que no processo desanexar.

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

O que você deseja fazer?

Consulte também

Conceitos

DLLs