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.
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.
- 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.
- 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