Artigo: 201318 - Última revisão: quinta-feira, 28 de Abril de 2005 - Revisão: 3.0

Recebe uma mensagem de erro "O sistema não consegue localizar o ficheiro especificado" quando regista 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 | Reduzir tudo

Sintomas

Registar um servidor ATL que tenha um nome de ficheiro longos ou um que resida num directório com um nome de caminho longo, devolve um 0 x 80070002 erro:
O sistema não é possível encontrar o ficheiro especificado.
Para dll, este erro é devolvido pelo regsvr32.exe. Para EXEs, a chamada para Module::RegisterServer (CComModule::RegisterServer) em _tWinMain() devolve este erro.

Causa

Código de registo do ATL utiliza GetShortPathName() para obter o nome abreviado do ficheiro e utiliza o nome abreviado para o registo. GetShortPathName() falha se o ficheiro não tiver um nome curto de ficheiro. O comportamento predefinido do Windows NT, Windows 95 e Windows 98 é criar automaticamente nomes de ficheiro curto (formato 8.3) para ficheiros com nomes longos. Pode desactivar esta opção utilizando o "sistema de política de Editor" (Poledit.exe). Alguns sistemas de ficheiros também não suportam criação de nomes abreviados por predefinição. ATL tenta utilizar o nome de ficheiro inválido devolvido por GetShortPathName() numa chamada para LoadLibraryEx() e falha com 0 x 80070002.

Resolução

Quando é chamado GetShortPathName() na origem de ATL, adicione código para verificar se é ou não êxito. Tem de ser modificadas as seguintes funções:
  • 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);
				
em CComModule::RegisterClassHelper (ATLBASE.H, linha 5044), altere as seguintes linhas a partir 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);
				
estas alterações não tem nenhum resultado se criar para ReleaseMinSize, uma vez que código ATL.dll é utilizado em vez disso.

Ponto Da Situação

A Microsoft confirmou que este é um erro no Microsoft produtos listados no início deste artigo. Este erro foi corrigido no Visual Studio 6.0 Service Pack 3.
Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
194295  (http://support.microsoft.com/kb/194295/ ) COMO: Determinar que Service Studio 6.0 Visual Packs estão instalados
Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
194022  (http://support.microsoft.com/kb/194022/ ) INFO: Visual Studio 6.0 Service Packs, que, em que, por que razão

Mais Informação

ATL regista servidores utilizando o nome curto de ficheiro para resolver um erro no CreateProcess() função Windows NT.

Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
179690  (http://support.microsoft.com/kb/179690/ ) CORRECÇÃO: Iniciar o servidor COM devoluções de nome de ficheiro longo 0x80080005
Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
173673  (http://support.microsoft.com/kb/173673/ ) Windows NT Server Tools para o Windows NT Workstation 4.0 disponíveis

Referências

Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
179690  (http://support.microsoft.com/kb/179690/ ) Erro: TCProps.dll Falha ao registar durante o programa de configuraçã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 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: 201318  (http://support.microsoft.com/kb/201318/en-us/ )