ID do artigo: 201318 - Última revisão: quinta-feira, 28 de abril de 2005 - Revisão: 3.0

Você receber uma mensagem de erro "O sistema não é possível localizar o arquivo especificado" quando você registra um servidor ATL com um nome longo

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Expandir tudo | Recolher tudo

Sintomas

Registrar um servidor ATL que tenha um nome de arquivo longo ou um que reside em um diretório com um nome de caminho longos, retorna um 0 x 80070002 erro:
O sistema não é possível localizar o arquivo especificado.
Para DLLs, este erro é retornado pelo Regsvr32.exe. Para EXEs, a chamada para Module::RegisterServer (CComModule::RegisterServer) no _tWinMain() retorna este erro.

Causa

Código de registro do ATL usa GetShortPathName() para recuperar o nome curto do arquivo e usa o nome curto para o registro. GetShortPathName() falhará se o arquivo não tiver um nome de arquivo curto. O comportamento padrão no Windows NT, Windows 95 e Windows 98 é criar automaticamente nomes de arquivo curtos (formato 8.3) para arquivos com nomes longos. Você pode desativar essa opção usando o "System Policy Editor" (Poledit.exe). Alguns sistemas de arquivos também não oferecem suporte criação de nomes curtos por padrão. ATL tenta usar o nome de arquivo inválido retornado pela GetShortPathName() em uma chamada para LoadLibraryEx() e falha com 0 x 80070002.

Resolução

Quando GetShortPathName() é chamado na fonte de ATL, adicione código para verificar se há ou não teve êxito. As seguintes funções devem ser modificadas:
  • CComModule::UpdateRegistryFromResourceS(UINT...) - ATLBASE.H, linha 4933.
  • CComModule::UpdateRegistryFromResourceS(LPCTSTR...) - ATLBASE.H, linha 4965.
  • AtlModuleUpdateRegistryFromResourceD() - ATLBASE.H, linha 5896.
Alterar as seguintes linhas de:
// Convert to short path to work around bug in Windows NT 4.0's CreateProcess.
TCHAR szModuleShort[_MAX_PATH];
GetShortPathName(szModule, szModuleShort, _MAX_PATH);
LPOLESTR pszModule = T2OLE(szModuleShort);
				
à seguinte:
// Convert to short path to work around bug in Windows NT 4.0's CreateProcess.
TCHAR szModuleShort[_MAX_PATH];
int cbShortName = GetShortPathName(szModule, szModuleShort, _MAX_PATH);
LPOLESTR pszModule;
if (cbShortName == _MAX_PATH)
    return E_OUTOFMEMORY;
pszModule = (cbShortName == 0||cbShortName == ERROR_INVALID_PARAMETER) \  ? T2OLE(szModule) : T2OLE(szModuleShort);
				
in CComModule::RegisterClassHelper (ATLBASE.H, linha 5044), altere as seguintes linhas de:
// Convert to short path to work around bug in Windows NT 4.0's CreateProcess.
TCHAR szModuleShort[_MAX_PATH];
GetShortPathName(szModule, szModuleShort, _MAX_PATH);
key.SetKeyValue(szLS32, szModuleShort);
				
à seguinte:
// Convert to short path to work around bug in Windows NT 4.0's CreateProcess.
TCHAR szModuleShort[_MAX_PATH];
int cbShortName = GetShortPathName(szModule, szModuleShort, _MAX_PATH);
if (cbShortName == _MAX_PATH)
    return E_OUTOFMEMORY;
if (cbShortName == 0 || cbShortName == ERROR_INVALID_PARAMETER)
    key.SetKeyValue(szLS32, szModule);
else
    key.SetKeyValue(szLS32, szModuleShort);
				
essas alterações não tem nenhum resultado se você criar para ReleaseMinSize, porque o código em ATL.dll é usado em vez disso.

Situação

A Microsoft confirmou que este é um bug no Microsoft produtos que estão listados no início deste artigo. Esse bug foi corrigido no Visual Studio 6.0 Service Pack 3.
Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
194295  (http://support.microsoft.com/kb/194295/ ) COMO: Saber que Visual Studio 6.0 Service Packs Are Installed
Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
194022  (http://support.microsoft.com/kb/194022/ ) INFO: Visual Studio 6.0 Service Packs, What, WHERE, por que

Mais Informações

ATL registra servidores usando o nome de arquivo curto para solucionar um erro na função de CreateProcess() do Windows NT.

Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
179690  (http://support.microsoft.com/kb/179690/ ) CORRECÇÃO: Iniciando COM Server com retorna de nome de arquivo longo 0x80080005
Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
173673  (http://support.microsoft.com/kb/173673/ ) Ferramentas do Windows NT Server para Windows NT Workstation 4.0 disponíveis

Referências

Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
179690  (http://support.microsoft.com/kb/179690/ ) Erro: TCProps.dll Falha ao registrar durante a instalação

A informação contida neste artigo aplica-se a:
  • Microsoft ActiveX Template Library 3.0 nas seguintes plataformas
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
Palavras-chave: 
kbmt kbbug kbfaq kbfix kbregistry kbvs600sp3fix KB201318 KbMtpt
Tradução automáticaTraduçã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: 201318  (http://support.microsoft.com/kb/201318/en-us/ )