Compartilhar via


Biblioteca em time de execução comportamento

O C/C ++ em time de execução biblioteca código realiza a sequência de inicialização da DLL, eliminando a necessidade de link com um separado módulo sistema autônomo era necessário no Windows 3.x.Incluído no C/C++ em time de execução código da biblioteca é a função de ponto de entrada DLL chamada _DllMainCRTStartup.The _DllMainCRTStartup função faz várias coisas, inclusive chamar _CRT_INIT, que inicializa o C/C ++ em time de execução biblioteca e invoca construtores C++ em variáveis estáticas e não-local.Sem essa função, o em time de execução biblioteca poderia ser deixada em estado não inicializado._CRT_INIT está disponível para um CRT vinculado estaticamente ou vinculando 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, ele não é recomendável porque sua função de ponto de entrada teria que duplicar tudo que _DllMainCRTStartup faz.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.

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

O C/C ++ em time de execução biblioteca código chama construtores e destrutores em variáveis estáticas e não-local.Por exemplo, no seguinte código de fonte DLL, Equus e Sugar dois objetos estático, não-local da classe CHorse, definido no 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 para o destruidor funcionar porque esses objetos estão definidos fora de qualquer função. Portanto, as chamadas para esses construtores e destrutores devem ser realizadas pela em time de execução código.O em time de execução código da biblioteca para os 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)
...

Sempre que um novo processo de tenta usar a DLL, o sistema operacional cria uma cópia separada dos dados da DLL: Isso é chamado de processo de anexar.O em time de execução código da biblioteca para a DLL chama os construtores de todos os objetos global, se houver e, em seguida, chama o DllMain Anexar funcionar com o processo selecionado. A situação oposta é um processo desanexar: o em time de execução biblioteca código chama DllMain processo desanexar selecionado e, em seguida, chama uma lista de funções de terminação, incluindo atexit funções, destruidores para objetos global e destruidores para objetos estático. Observe que a ordem de eventos no processo de anexar é desanexar o oposto do que no processo.

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

O que você deseja fazer?

Consulte também

Conceitos

DLLs