Erro ASP 0177: 8007007e Server.CreateObject falha para COM DLL

Estamos tentando instalar uma DLL COM em um novo servidor. A interface é ASP clássico. A DLL do conector de mapa parece ser o problema, mas isso é o máximo que posso obter.

Não conseguimos que as páginas servidas pelo IIS forneçam algo além de um erro 500.

Ao rastrear o ASP:

 127. -ASP_SCRIPT_TRACE_COM_CALL_END 


 Caminho de arquivo
 C: \ INETPUB \ WWWROOT \ MILER \ GLOBAL.ASA 

 Número da linha
 6 

 CurrentStatement
 set g_pcmsrv = Server.CreateObject ("PCMServer.PCMServer") 

 SizeOfStatement
 55 


 0 ms


 128. -ASP_LOG_ERROR 


 Número da linha
 6 

 Erro de código
 ASP 0177: 8007007e 

 Descrição
 Server.CreateObject falhou

A DLL é PCMSRV32.DLL em c:\windows

GLOBAL.ASA:

 Sub Application_OnStart set g_pcmsrv=Server.CreateObject("PCMServer.PCMServer") set application("g_pcmsrv") = g_pcmsrv set g_pcmmapmgr=Server.CreateObject("Pcmgole.PCMMapMgr") set application("g_pcmmapmgr") = g_pcmmapmgr End Sub Sub Session_OnStart set Session("currentTrip") = application("g_pcmsrv").NewTrip("NA") set Session("map") = application("g_pcmmapmgr").createMap() End Sub Sub Session_OnEnd set Session("currentTrip") = Nothing set Session("map") = Nothing End Sub Sub Application_Onend Set application("g_pcmsrv")=Nothing Set application("g_pcmmapmgr")=Nothing End Sub 

   

    O conselho abaixo se refere ao uso de Server.CreateObject e CreateObject em

    vbscript jscript vba

    As seções do servidor web são específicas para asp-classic, mas ainda vale a pena ler.


    O que causa esse erro?

    Server.CreateObject falhou

    é causado mais comumente quando os Aplicativos da Web são movidos de um Servidor da Web para outro sem um entendimento dos componentes COM externos que estão em uso e registrados com o servidor da Web.

    Do PRB: Server.CreateObject Retorna HTTP 500.100 ou erro ASP 0177 (0x8007007E)

    Este erro ocorre quando você tenta usar o método Server.CreateObject para instanciar um object que não está registrado no sistema local.

    Identificando a fonte do erro

    Se você estiver usando componentes COM dentro de um aplicativo da Web ASP, você verá uma linha como esta

     set g_pcmsrv=Server.CreateObject("PCMServer.PCMServer") 

    Normalmente, o erro apontará para a linha Set , o que torna a identificação da causa mais fácil (por sorte, você tem algum código de rastreamento legal no lugar, então é ainda melhor) .

    E se você não souber onde a DLL está localizada?

    Nota: Tenha cuidado ao acessar o Registro do Windows, pois é muito mais fácil fazer mudanças inadvertidamente que tenham sérias conseqüências para o Sistema Operacional e, em casos extremos, exigirão a restauração ou reinstalação do sistema.

    A string dentro do método CreateObject é conhecida como ProgId e é usada como um identificador para uma chave dentro do Registro do Windows que pode ser encontrada dentro do

    Nota: O Registro do Windows pode ser pesquisado na maioria das versões do Windows usando o regedit.exe também conhecido como Editor do Registro. Tenha muito cuidado ao usar essa ferramenta para navegar no Registro do Windows.

     HKEY_CLASSES_ROOT 

    e por extensão

     HKEY_LOCAL_MACHINE\Classes 

    Sempre que o processador ASP encontra um ProgId ele tenta falar com o registro do Windows e encontrar uma chave correspondente que indica o local da DLL acessível COM.

     HKEY_CLASSES_ROOT\PCMServer.PCMServer 

    Uma abordagem comum para isso é a chave contém uma subchave chamada CLSID que aponta para o GUID de class para a DLL registrada associada. Quando a chave GUID estiver localizada no

     HKEY_CLASSES_ROOT 

    hive ele pode ser usado para encontrar o local olhando na subchave

     HKEY_CLASSES_ROOT\{GUID from CLSID}\InprocServer32 

    onde o local será armazenado no valor (default) .

    Exemplo usando o ProgIdScripting.FileSystemObject

    1. Localize a subchave Scripting.FileSystemObject em HKEY_CLASSES_ROOT

       HKEY_CLASSES_ROOT\Scripting.FilesystemObject 
    2. Identificar GUID da subchave CLSID

       HKEY_CLASSES_ROOT\Scripting.FilesystemObject\CLSID (default) - "{0D43FE01-F093-11CF-8940-00A0C9054228}" 
    3. Use o GUID para localizar a subchave de DLL registrada em HKEY_CLASSES_ROOT

       HKEY_CLASSES_ROOT\{0D43FE01-F093-11CF-8940-00A0C9054228} 
    4. Verificar subchave InprocServer32 (default) valor para o local da DLL

       HKEY_CLASSES_ROOT\{0D43FE01-F093-11CF-8940-00A0C9054228}\InprocServer32 (default) - "C:\Windows\System32\scrrun.dll" 

    Nenhum PCMServer.PCMServer para PCMServer.PCMServer no registro?

    Se você não consegue encontrar o ProgId correspondente no registro, é provável que seja devido a um dos dois motivos pelos quais iremos elaborar aqui.

    1. A DLL não está registrada.
    2. A DLL está registrada na área errada.

    Como registrar a DLL COM com o Windows

    DLLs COM podem ser registradas e ter as inputs do Registro correspondentes criadas executando a ferramenta regsvr32.exe partir do prompt de comando do Windows usando permissions elevadas (isso varia de versão para versão do Windows) .

    Antes de continuar, a arquitetura do sistema operacional e o modo usado pelo aplicativo da Web ASP são muito importantes.

    A maioria dos hardwares mais novos é de 64 Bits, o que cria um enigma no Windows, já que agora ele tem que suportar a mais nova arquitetura de 64 bits e ainda manter o suporte para a arquitetura de 32 bits. A solução que a Microsoft criou foi dividir o sistema operacional em dois, de modo que temos elementos de 64 bits e elementos de 32 bits. Os principais programas do sistema operacional são divididos em duas pastas (apenas no sistema operacional de 64 bits porque um sistema operacional de 32 bits não precisa lidar com 64 bits, mesmo que o hardware seja capaz disso) .

    Nota: Em sistemas de 32 bits apenas use os locais de 64 bits para ambos os arquivos de sistema e o registro do Windows.

    Em um sistema operacional de 64 bits, os programas do sistema estão localizados em

    1. Para programas de 64 bits

       %SystemRoot%\System32\ 
    2. Para programas de 32 bits

       %SystemRoot%\SysWOW64\ 

    Isso também se aplica ao Registro do Windows

    1. 64 bits

       HKEY_CLASSES_ROOT 
    2. 32 bits

       HKEY_CLASSES_ROOT\Wow6432Node 

    Assim, por exemplo, em uma versão de 64 bits do Windows, o seguinte comando registrará o PCMSRV32.DLL no Registro de 32 bits e criará as chaves de registro do COM DLL associadas.

     C:\Windows\SysWOW64>regsvr32 "C:\Windows\PCMSRV32.DLL" 

    Pool de aplicativos do IIS

    Como tudo começa a suportar 64 Bits, incluindo o IIS, você ainda precisa ser capaz de suportar aplicativos legados que suportem apenas 32 Bit COM, para que o IIS seja introduzido no IIS 6.0 (a partir do Windows Server 2003, Service Pack 1) nas configurações do Pool de Aplicativos. propriedade Enabled32BitAppOnWin64 que permite que o pool de aplicativos seja executado no modo de 32 bits em versões de 64 bits do Windows.

    Com isso em mente antes de registrar a DLL COM para saber onde você deve registrá-la, é necessário saber se o Pool de Aplicativos está sendo executado no Modo 32 Bit. No IIS 7.0 e acima, você pode apenas verificar isso nas propriedades do Pool de aplicativos dentro do aplicativo Gerenciador do IIS. A configuração está nas Advanced Settings na seção General e é chamada Enable 32-Bit Applications (também pode ser configurada no applicationHost.config usando enable32BitAppOnWin64 na seção ) .

    • Se a opção Enable 32-Bit Applications estiver definida como False

      O pool de aplicativos do IIS está sendo executado no modo nativo de 64 bits e qualquer DLL de COM que precise ser usado pelo aplicativo Web ASP precisará oferecer suporte a 64 bits e ser registrado usando a versão de 64 bits do regsvr32.exe para ser adicionado ao arquivo de 64 bits registro.

       C:\Windows\System32>regsvr32 "C:\Windows\PCMSRV32.DLL" 
    • Se a opção Enable 32-Bit Applications estiver definida como True

      O pool de aplicativos do IIS está sendo executado no modo de 32 bits e qualquer COM DLLs que precisam ser usados ​​pelo aplicativo da Web ASP precisará ser 32 bits COM DLLs e ser registrados usando a versão de 32 bits do regsvr32.exe para ser adicionado no 32 Registro de bit.

       C:\Windows\SysWOW64>regsvr32 "C:\Windows\PCMSRV32.DLL" 

    Registrando a DLL COM usando a versão incorreta do regsvr32.exe

    Por exemplo, usando

     C:\Windows\SysWOW64>regsvr32 "C:\Windows\PCMSRV32.DLL" 

    registrar a DLL COM com o registro de 32 bits em uma versão de 64 bits do Windows quando o pool de aplicativos do IIS não estiver no modo de 32 bits fará com que o 500.100 interno do ASP 500.100 Server

    Erro de object do servidor ‘ASP 0177: 8007007e’

    Server.CreateObject falhou


    Lista de verificação COM DLL

    1. O que é o conjunto de aplicativos do IIS Advanced Setting Enable 32-Bit Applications definido como, pois ele afeta como você registra a DLL COM?

    2. A DLL é registrada usando a versão específica de arquitetura do regsvr32.exe (se a versão do Windows não for 64 bits use o padrão) que reflita a configuração Enable 32-Bit Applications ?

    3. O Registro do Windows contém um ProgId para a DLL no local específico da arquitetura do

       HKEY_CLASSES_ROOT 

      que reflete a configuração de Enable 32-Bit Applications ?

    4. A chave InprocServer32 contém o local correto para a DLL?

    5. No contexto da conta que estou usando para acessar a DLL COM (ApplicationIdentity, LocalSystem, NetworkService etc) , tenho permissão para acessar o arquivo DLL físico e as inputs do Registro?


    Links Úteis

    • PROBLEMA: Server.CreateObject Retorna HTTP 500.100 ou Erro ASP 0177 (0x8007007E) (O link Sorry não funciona mais, já que a Microsoft apagou completamente o artigo da base de conhecimento, não é possível localizá-lo usando archive.org) .