Motivos possíveis para falha de registro de controle OLE

Traduções deste artigo Traduções deste artigo
ID do artigo: 140346 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

OLE controles podem ser registrados usando o Visual C++ no menu Ferramentas, do contêiner de teste fornecido com o CDK (Kit de desenvolvimento de controle), ou usando os aplicativos regsvr ou regsvr32 fornecidos com o Visual C++. Em alguns casos, o registro de um controle pode falhar; use neste artigo para ajudar a solucionar o problema.

Mais Informações

Todos os métodos mencionados anteriormente para registrar um controle OLE usam essencialmente a mesma técnica. LoadLibrary() é chamado para carregar o controle na memória, GetProcAddress() é chamado para obter o endereço da função DllRegisterServer() e, em seguida, DllRegisterServer() é chamado para registrar o controle.

Motivos por que o registro de um controle pode falhar

  • Um ou mais necessário DLLs OLE não está no caminho. Instruções para a distribuição controles OLE, bem como uma explicação sobre o que são necessárias para enviar DLLs podem ser encontradas no Shipctrl.wri arquivo localizado no mesmo diretório como o CDK.
  • O controle está carregando uma DLL diferente de DLL OLE, e essa DLL não está no caminho. Quando o controle é carregado na memória, quaisquer DLLs são carregados implicitamente por meio de uma biblioteca de importação também são carregados. Se qualquer uma dessas DLLs não estão no caminho, o controle não será carregado com êxito, para que o registro falha.
  • Uma ou mais DLLs podem ser a versão errada. Se o controle foi criado com uma versão mais recente de uma DLL que a instalada no computador, o controle pode não carregar corretamente, para que o registro falha.
  • Uma versão antiga do Ocd25.lib está sendo vinculada. Se o controle estiver usando as classes de banco de dados MFC, pode haver um problema com a versão do arquivo Ocd25.lib que está sendo vinculada.
  • O controle OLE está localizado em unidade remota um servidor Novell. Nesse caso, os direitos de acesso para o arquivo .ocx podem estar impedindo o controle de carregamento. Certifique-se que os direitos de acesso para o arquivo .ocx estão definidos para o acesso somente leitura, compartilhável, que é a configuração típica para arquivos executáveis.

Solução de problemas técnicas

Se nenhuma das possíveis causas for verdadeira no seu caso, tente as seguintes técnicas.

  1. Com o projeto de controle carregado no Visual C++, defina o executável para a sessão de depuração para o OLE controle contêiner de teste (Tstcon16.exe ou Tstcon32.exe). Quando você inicia o contêiner de teste (sob o depurador), você receberá um aviso de que o contêiner de teste não contém informações de depuração. Ignorar isso e continuar.
  2. A partir do contêiner de teste, tente registrar o controle. Assista a saída de depuração da DLL de controle OLE ou qualquer uma das suas DLLs dependentes. Se você estiver executando o produto de 16 bits, lembre-se executar o DBWIN programa para receber saída de depuração.

    Para obter informações sobre como definir o executável para uma DLL de sessão de depuração, consulte o tópico de Ajuda "Depuração DLLs" nos manuais online do.
Como alternativa, você pode tentar registrar o controle programaticamente. Primeiro, crie um aplicativo MFC AppWizard selecionando aplicativo baseado em diálogo e automação OLE. Habilitar Automação OLE irá inicializar o OLE para que o código para registrar o controle funcionem corretamente. Na classe derivada de CWinApp, você irá encontrar a função InitInstance() com o código inicial da seguinte maneira:
BOOL CTestregApp::InitInstance()
{

   // Initialize OLE libraries
   if (!AfxOleInit())
   {
      AfxMessageBox(IDP_OLE_INIT_FAILED);
      return FALSE;
   }
				
neste ponto, adicione o seguinte segmento de código, que permitirá que você verifique os códigos de retorno de LoadLibrary(), GetProcAddress() e DllRegisterServer.
#ifdef _WIN32
    HINSTANCE hDLL = LoadLibrary("some.ocx");
    if(NULL == hDLL)
    {
        // See Winerror.h for explaination of error code.
        DWORD error = GetLastError();
        TRACE1("LoadLibrary() Failed with: %i\n", error);
        return FALSE;
    }

    typedef HRESULT (CALLBACK *HCRET)(void);
    HCRET lpfnDllRegisterServer;

    lpfnDllRegisterServer =
            (HCRET)GetProcAddress(hDLL, "DllRegisterServer");
    if(NULL == lpfnDllRegisterServer)
    {
        // See Winerror.h for explaination of error code.
        DWORD error = GetLastError();
        TRACE1("GetProcAddress() Failed with %i\n", error);
        return FALSE;
    }

    if(FAILED((*lpfnDllRegisterServer)()))
    {
        TRACE("DLLRegisterServer() Failed");
        return FALSE;
    }

#else // 16-bit
    HINSTANCE hDLL = LoadLibrary("regtest.ocx");
    if(HINSTANCE_ERROR > hDLL)
    {
        // See LoadLibrary() help for explaination of error code.
        TRACE1("LoadLibrary() Failed with: %i\n", hDLL);
        return FALSE;
    }

    typedef HRESULT (CALLBACK *HCRET)(void);
    HCRET lpfnDllRegisterServer;

    lpfnDllRegisterServer =
            (HCRET)GetProcAddress(hDLL, "DllRegisterServer");
    if(NULL == lpfnDllRegisterServer)
    {
        // See GetProcAddress() help for explaination of error code.
        TRACE("GetProcAddress() Failed");
        return FALSE;
    }

    if(FAILED((*lpfnDllRegisterServer)()))
    {
        TRACE("DLLRegisterServer() Failed");
        return FALSE;
    }
#endif
				

Propriedades

ID do artigo: 140346 - Última revisão: segunda-feira, 1 de dezembro de 2003 - Revisão: 2.0
A informação contida neste artigo aplica-se a:
  • Microsoft Visual C++ 1.5 Professional Edition
  • Microsoft Visual C++ 1.51
  • Microsoft Visual C++ 1.52 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 2.2
  • Microsoft Visual C++ 4.0 Standard Edition
Palavras-chave: 
kbmt kbcode kbctrl KB140346 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 140346
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com