Razões possíveis para falha de registo do controlo OLE

Traduções de Artigos Traduções de Artigos
Artigo: 140346 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

OLE controlos podem ser registados utilizando o Visual C++ no menu Ferramentas, a partir do contentor de teste fornecidos com o controlo Development Kit (CDK), ou utilizando as aplicações de registar ou regsvr32 fornecidas com o Visual C++. Em alguns casos, o registo de um controlo pode falhar; utilize deste artigo para ajudar a resolver o problema.

Mais Informação

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

Razões por que razão o registo de um controlo pode falha

  • Um ou mais das necessário OLE DLLs não consta do caminho. Poderá encontrar instruções para distribuição de controlos OLE, bem como uma explicação sobre o que dll necessários enviar o Shipctrl.wri ficheiro localizado no mesmo directório que o CDK.
  • O controlo está a carregar uma DLL diferente a DLL OLE e esse DLL não está no caminho. Quando o controlo é carregado na memória, também são carregadas qualquer dll implicitamente são carregadas através de uma biblioteca de importação. Se qualquer destas DLL não estiver no caminho, o controlo não é carregado com êxito, pelo que falha de registo.
  • Uma ou mais dll (S) podem ser a versão errada. Se o controlo foi criado com uma versão mais recente de uma DLL que o instalado no computador, o controlo pode não carregar correctamente, pelo registo falhar.
  • Uma versão antiga do Ocd25.lib está a ser ligada. Se o controlo está a utilizar as classes de base de dados MFC, poderá existir um problema com a versão do ficheiro Ocd25.lib que está a ser ligado.
  • O controlo OLE está localizado na unidade remota de um servidor Novell. Neste caso, os direitos de acesso ao ficheiro .ocx poderão estar a impedir o controlo de carregamento. Certifique-se que os direitos de acesso para o ficheiro .ocx estão definidos como só de leitura, partilhável acesso, que é a configuração típica para ficheiros executáveis.

Técnicas de resolução de problemas

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

  1. Com o projecto de controlo carregado no Visual C++, defina o executável para a sessão de depuração para o OLE controlo teste contentor (Tstcon16.exe ou Tstcon32.exe). Quando inicia o contentor de teste (em depurador), receberá um aviso de que o contentor de teste não contém informações de depuração. Ignorar este e continue.
  2. Do contentor de teste, tente registar o controlo. Procure a saída de depuração da DLL de OLE controlo ou qualquer uma das suas DLLs dependentes. Se estiver a utilizar o produto de 16 bits, lembre-se executar o DBWIN programa 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" no Books Online.
Como alternativa, pode tentar registar o controlo por programação. Crie primeiro uma aplicação de MFC AppWizard seleccionar aplicação baseada na caixa de diálogo e automatização OLE. Activar automatização OLE inicializar OLE, para que o código para registar o controlo funcione correctamente. Classe derivada de CWinApp, encontrará a função InitInstance() com o código inicial da seguinte forma:
BOOL CTestregApp::InitInstance()
{

   // Initialize OLE libraries
   if (!AfxOleInit())
   {
      AfxMessageBox(IDP_OLE_INIT_FAILED);
      return FALSE;
   }
				
neste ponto, adicionar o segmento de código seguinte, que lhe permitirá verificar os códigos de retorno 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

Artigo: 140346 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 140346
Exclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.

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