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