Artigo: 198891 - Última revisão: quinta-feira, 22 de Fevereiro de 2007 - Revisão: 9.3

Como executar um objecto COM baseados em DLL fora de processo do SQL Server

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.

Nesta página

Expandir tudo | Reduzir tudo

Sumário

Microsoft SQL Server 6.5 ou posterior fornece a capacidade de carregar e executar objectos COM (Component Object Model) personalizado através de um conjunto de automatização OLE procedimentos armazenados ou através de procedimentos armazenados expandido. Por predefinição, os objectos baseados em DLL COM são carregados como no processo de servidor, o que significa que os objectos COM não são carregados apenas dentro do espaço de endereços do SQL Server processo memória, mas também têm acesso total a este espaço de endereço de memória. Por conseguinte, um objecto COM carregados no espaço de processo do SQL Server tem aderem às mesmas regras que qualquer ficheiro DLL. Existe uma potencial que um objecto COM poderá substituir memória dentro dos do SQL Server processo ou fuga de recursos, provocando instabilidade.

Se suspeita que um objecto COM poderá estar a afectar a robustez do processo do SQL Server, poderá utilizar os passos neste artigo para instanciar o objecto COM o espaço de processo do SQL Server. Implementação do Distributed Component Object Model (DCOM) especificação de "Localização transparência" no sistema operativo forneceu a capacidade de executar um objecto COM baseados em DLL fora do espaço de processo do SQL Server.

O processo de executar um objecto COM baseados em DLL fora do espaço de endereços da aplicação principal é chamado sistema de interacção remota. Sistema de interacção remota requer executável outro processo substituto em vez do executável do SQL Server. A predefinição executável utilizada pelo DCOM Service Control Manager (RPCSS.exe) chama Dllhost.exe. A estrutura de suporte do DCOM utiliza o ficheiro Dllhost.exe para carregar a DLL para o espaço de processo e, em seguida, utiliza proxy/stub pares para organizar a interface pedida de forma transparente ao cliente, neste caso é o SQL Server. Este executável pode aceitar em simultâneo vários pedidos de interface/método. Depois de concluída a utilização de interface, o Gestor de controlo de serviço DCOM (SCM) gere a limpar cópias e descarregar do ficheiro Dllhost.exe. Objectos COM não devem ser esperados para manter informações de estado entre instâncias.

De forma a deste artigo para funcionar correctamente, o sistema tem de ter um sistema operativo do DCOM activado. Este seria o Microsoft Windows NT 4.0 Service Pack 2 ou posterior, Microsoft Windows 98 ou Microsoft Windows 95 com o suplemento DCOM instalado. Os seguintes passos podem aplicar a qualquer objecto DLL baseadas em COM que está a ser criado no espaço de processo do SQL Server, se é instanciado através de sp_OACreate ou um procedimento armazenado expandido.

Mais Informação

Segue-se informações sobre os dois métodos básicos que pode utilizar para instanciar o objecto COM fora do processo.

COM remoto de pedidos de cliente do objecto

Alterando a forma como o que invocar o objecto COM, pode pedir que o objecto ser criadas fora do espaço de endereço do SQL Server.
  • Se o objecto COM for carregado, utilizando o procedimento sp_OACreate , por predefinição este é carregado no processo. No entanto, existe um terceiro parâmetro opcional para este procedimento que pode que pode utilizar para indicar o contexto de onde pretende criar o objecto. Se este parâmetro não for especificado, a predefinição de cinco (5) é utilizado, que significa executar o objecto dentro ou fora do processo. Terá de alterar o parâmetro para quatro (4), que indica para o DCOM está este componente a ser executado como um executável local. Utilize sintaxe semelhante ao exemplo seguinte para informar explicitamente DCOM para executar o objecto COM "fora do processo" sp_OACreate a utilizar o procedimento armazenado:
       DECLARE @object int
       DECLARE @hr int
       EXEC @hr = sp_OACreate 'SQLOLE.SQLServer', @object OUT, 4
    						
  • Se o objecto COM é criado dentro de uma extensão procedimento armazenado o terceiro parâmetro de CoCreateInstance ou função CoCreateInstanceEx pode ser alterado para CLSCTX_LOCAL_SERVER. Este é apresentado no seguinte exemplo de código utilizando CoCreateInstance :
       HRESULT hr = CoCreateInstance(CLSID_Test, NULL, CLSCTX_LOCAL_SERVER,
         IID_IUnknown, (void**)&piunknown);
    						

Modificar o registo para forçar o sistema de interacção remota do objecto

Se não é possível modificar o cliente COM a pedir que o objecto ser criadas fora do processo, existem dois métodos diferentes para forçar o objecto a ser criadas fora do processo.
  • Utilize o Visualizador de objectos OLE/COM (Oleview.exe) que é fornecido com o Microsoft Visual C++ e localize o ProgID sob a forma de OLEComponent.Object em Todos os objectos . Seleccione o objecto COM e, em seguida, no menu de objecto , seleccione CoCreateInstance sinalizadores . Certifique-se que apenas CLSCTX_LOCAL_SERVER está seleccionada. Em seguida, no Servidor InProc e implementação separadores seleccione Utilizar processos de substituição e deixar o "caminho para personalizar substituto" em branco, que permite que o ficheiro Dllhost.exe seja carregado e DLL COM apresentada dentro do respectivo espaço de processo.

    Se não tiver o Microsoft Visual C++, o utilitário OLE/COM objecto Viewer também está disponível para transferência a partir do seguinte Web site da Microsoft:
    http://www.microsoft.com/downloads/details.aspx?familyid=5233b70d-d9b2-4cb5-aeb6-45664be858b6&displaylang=en (http://www.microsoft.com/downloads/details.aspx?familyid=5233b70d-d9b2-4cb5-aeb6-45664be858b6&displaylang=en)
  • Utilize os seguintes passos para actualizar manualmente o registo.

    aviso Podem ocorrer problemas graves se modificar o registo incorrectamente utilizando o Editor de registo ou utilizando outro método. Estes problemas poderão forçar a reinstalação do sistema operativo. Microsoft não garante que estes problemas podem ser resolvidos. Modificar o registo por sua conta e risco.
    1. Obter o identificador de classe (CLSID) do objecto COM. O CLSID é um número de 128 bits e considerada um identificador exclusivo global (GUID) que é utilizado para identificar exclusivamente o componente, módulo ou ficheiro que contém este objecto COM. Quando criar objectos COM utilizando a automatização OLE procedimentos armazenados, o primeiro parâmetro para o procedimento armazenado é um identificador de programação ou o ProgID do objecto OLE é utilizado para derivar o CLSID. Esta cadeia de caracteres descreve a classe do objecto OLE e tem o seguinte formato:
            OLEComponent.Object
      								
      pode utilizar o identificador programático para localizar o identificador de classe para um objecto COM.

      Abrir o Editor de registo (Regedit.exe) e sob a chave HKEY_CLASSES_ROOT utilize o método Localizar para localizar uma chave com o nome do seu <OLEComponent.Object>. Encontrará outros níveis, mas deve ser localizada no nível directamente abaixo de HKEY_CLASSES_ROOT. Depois de localizar a chave, expanda a pasta para o nome da chave e deverá ver uma subchave com o nome CLSID. Faça clique sobre essa pasta para ver os valores dentro dessa chave. No lado direito do ecrã é um título denominado "(predefinido)". Os dados para essa chave devem estar no seguinte formato:
            {59F929A0-74D8-11D2-8CBC-08005A390B09}
      								
      Tome nota deste valor ou copiá-lo para o bloco de notas. Inclua os parênteses rectos.
    2. Navegue na chave HKEY_CLASSES_ROOT\CLSID e localize a subchave com este número GUID. Depois de destaque a chave HKEY_CLASSES_ROOT\CLSID pode utilizar a função Localizar no Editor de registo (no menu Editar ) e cole o GUID na caixa de diálogo Localizar . Certifique-se de que tiver encontrado a interface correcta por examinar a subchave InprocServer32 abaixo desta chave, que aponta para a localização do ficheiro DLL COM. Se existir uma chave TypeLib, verifique este valor GUID. Este deve ser diferente do que anotou no passo 1. Caso contrário, terá o GUID TypeLib e não o GUID para o objecto COM. A subchave ProgID terá um valor de 'OLEComponent.Object.1'. Uma na extremidade destina-se apenas este exemplo e é utilizada para informações sobre a versão.
    3. Enquanto subchave o GUID InprocServer32, certifique-se que existe um valor ThreadingModel e que é definido como qualquer ambos ou Free para garantir o empacotamento de referências compreende o modelo de thread do objecto COM para permitir a execução do COM espaço de processo do SQL Server. Se não for um valor ThreadingModel ou estiver definido para o compartimento, COM instâncias do objecto poderão não ser consistente.

      Nota Se adicionar ThreadingModel valor Certifique-se de que o utilizador testa o objecto COM antes de implementar.
    4. Realce a número/subchave GUID na chave HKEY_CLASSES_ROOT\CLSID. No menu Editar , clique em Novo e, em seguida, seleccione Valor da cadeia . Na coluna nome , escreva o seguinte:
      AppID
    5. Prima ENTER e, em seguida, insira o identificador de classe ou número GUID que tomou nota do passo 1 como o valor. O GUID deve estar dentro de chavetas, tal como no seguinte exemplo:
       
            {59F929A0-74D8-11D2-8CBC-08005A390B09} 
      
      								
      o identificador de aplicação AppID é utilizado pelo DCOM para associar a DLL de um ficheiro executável.
    6. Adicionar uma nova subchave a HKEY_CLASSES_ROOT\AppID e defina o respectivo nome para o mesmo identificador de classe ou GUID com as chavetas como inserido no passo anterior.
    7. Realce o nome GUID. No menu Editar , clique em Novo e, em seguida, seleccione Valor da cadeia . Na coluna nome , escreva o seguinte:
      DllSurrogate
      Deixe a coluna de dados em branco para este valor. Uma vez que a coluna de dados está em branco, isto informa o DCOM executar o ficheiro executável predefinido, Dllhost.exe e carregar o objecto COM no respectivo processo espaço.
    8. Feche o Editor de registo. Clique em Iniciar e, em seguida, clique em Executar . Na caixa de diálogo Executar escreva o seguinte:
      DCOMCNFG
      Prima a tecla ENTER para abrir a caixa de diálogo Propriedades da configuração DCOM . Clique no separador Propriedades predefinidas e certifique-se de que Activar DCOM neste computador está seleccionada. Se não estiver, seleccione-lo e, em seguida, clique em Aplicar .
    9. Certifique-se que a conta de utilizador do Microsoft Windows NT do SQL Server está a ser executado tem permissão "Full Control" nas chaves de registo para este objecto. Se as permissões não forem suficientes ou as chaves de registo são entradas incorrectamente os seguintes erros poderão ocorrer quando estiver a criar o objecto COM:
      Informações de erro de automatização OLE
      HRESULT: 0 X 80040154
      Origem: ODSOLE expandido procedimento
      Descrição: Classe não registada

      Informações de erro de automatização OLE
      HRESULT: 0 X 80070005
      Origem: ODSOLE expandido procedimento
      Descrição: Acesso negado.

      Informações de erro de automatização OLE
      HRESULT: 0X80080005
      Origem: ODSOLE expandido procedimento
      Descrição: A execução no servidor falhou
    10. Teste e ver se este está a executar o ficheiro Dllhost.exe e carregar o objecto COM no respectivo espaço de processo. Isto requer que o Microsoft Windows NT Resource Kit está no computador Windows NT no qual o SQL Server está a ser executado. Abra uma linha de comandos e a partir da linha de comandos execute o ficheiro Tlist.exe, que mostra todos os processos e os respectivos identificadores de processos associado ou identificadores de processo (PID). No script Transact-SQL onde sp_OACreate é executado e depois dessa chamada é executada, mas antes de terminar o script, utilize o seguinte para atrasar a conclusão de script para uma mais 20 segundos:
      WAITFOR DELAY '000:00:20'
      								
      executar o script e imediatamente navegue para a linha de comandos e execute o ficheiro Tlist.exe. Tenha em atenção Dllhost.exe PID. Volte a executar o Tlist.exe e passar o PID como um parâmetro. Apresenta as DLLs que são carregadas dentro do espaço de processo Dllhost.exe. O objecto COM baseados em DLL deverá estar listado como executar este processo. Depois do script regressa, executar novamente o Tlist.exe revela que o processo Dllhost.exe já não está em execução.

      A saída de exemplo seguinte é criado o objecto ADODB.Connection fora do espaço de processo do SQL Server. Este instantâneo utilizando Tlist.exe efectuado enquanto o objecto COM existia no espaço de processo Dllhost.exe. Repare que o módulo Msado15.dll, que é o módulo que contém o objecto COM, é carregado.
      C:\>tlist dllhost
       275 dllhost.exe
         CWD:     C:\NT40\system32\ 
         CmdLine: C:\NT40\System32\dllhost.exe {00000514-0000-0010-8000-00AA006D2EA4}
      -Embedding
         VirtualSize:    19180 KB   PeakVirtualSize:    19180 KB
         WorkingSetSize:  1780 KB   PeakWorkingSetSize:  1780 KB
         NumberOfThreads: 3
          278 Win32StartAddr:0x01001920 LastErr:0x00000000 State:Waiting
          215 Win32StartAddr:0x00001b5e LastErr:0x00000000 State:Waiting
          253 Win32StartAddr:0x00001b60 LastErr:0x000000cb State:Waiting
         4.0.1381.105 shp  0x01000000  dllhost.exe
         4.0.1381.130 shp  0x77f60000  ntdll.dll
         4.0.1381.121 shp  0x77dc0000  ADVAPI32.dll
         4.0.1381.133 shp  0x77f00000  KERNEL32.dll
         4.0.1381.133 shp  0x77e70000  USER32.dll
         4.0.1381.115 shp  0x77ed0000  GDI32.dll
         4.0.1381.131 shp  0x77e10000  RPCRT4.dll
         4.0.1381.117 shp  0x77b20000  ole32.dll
           6.0.8267.0 shp  0x78000000  MSVCRT.dll
                           0x1f310000  msado15.dll
          2.30.4265.1 shp  0x766f0000  OLEAUT32.dll
          4.0.1381.72 shp  0x77bf0000  rpcltc1.dll
      								
      com SQL Server versão 7.0 Desktop Edition em execução no Microsoft Windows 95 ou Microsoft Windows 98 estações de trabalho, "32-bit módulos carregado" na ferramenta de aplicação Microsoft informações de sistema pode ser utilizado durante a execução de Consulte loading\unloading do ficheiro Dllhost.exe e o objecto COM DLL durante este teste. Para aceder à ferramenta, clique em Iniciar , aponte para programas , aponte para Acessórios e, em seguida, clique em Ferramentas do sistema .
Nota Devido a limitações de segurança, Windows 95 ou Windows 98 não suporta iniciar um processo DLLSurrogate e carregar uma DLL COM por um cliente remoto. Assim, o objecto COM tem existe dentro ROT (com o objecto de tabela) e ser execução/carregado caso se trate de estar disponível para utilização por um computador cliente remoto. Pode utilizar os passos neste artigo para ajudar a isolar COM objectos quando estes são suspeita de estar a causar instabilidade no SQL Server. Certifique-se de que cada componente é testado exaustivamente a fora de processo para assegurar um comportamento consistente. Diferença de desempenho de um objecto COM no processo do SQL Server e fora do espaço de processo varia. Além disso, alguns objectos COM não foram criados para ser tornado remoto e podem divulgar recursos. Teste exaustivamente antes de implementar os passos neste artigo para algo que não seja um passo de resolução de problemas. O artigo Microsoft Knowledge Base seguinte tem um exemplo de como o sistema de interacção remota um objecto COM pode causar uma fuga de recursos:
197426  (http://support.microsoft.com/kb/197426/ ) CORRECÇÃO: Identificador fuga quando passar objectos ADO entre processos
Nota Microsoft SQL Server 6.5, por predefinição, funciona com o modelo de STA (single Thread Apartment) e processa a inicialização de objectos COM num thread separado interno. Neste modelo, está seleccionado um thread para controlar a criação de objectos OLE dentro de processo do SQL Server e proxy para todas as ligações de clientes que necessitam de acesso a este objecto COM. Porque é processado internamente pelo SQL Server, não é possível garantir a persistência do objecto entre instâncias do objecto COM.

Referências

Para obter mais informações sobre o modelo de objectos do SQL Server 6.5 COM, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
194661  (http://support.microsoft.com/kb/194661/ ) Modelo de persistência do SQL Server COM objectos
Para obter mais informações sobre a forma como o Sp_OA procedimento armazenado é implementado, clique no número de artigo que se segue para visualizar o artigo na base de dados de conhecimento da Microsoft:
180780  (http://support.microsoft.com/kb/180780/ ) Como é implementado Sp_OA procedimentos extensão para SQL Server
Para obter mais informações sobre como executar baseados em DLL COM objectos de substitutos de DLL; consulte o seguinte:

Eddon, Guy; Eddon Henry, no interior Distributed Com (Mps). A Microsoft Press, 1998, (ISBN 1-57231-849-X), capítulo oito: ' DLL substitutos e dos componentes do executável

Caixa, Don, COM Essential . Addison-Wesley Pub. Co., (ISBN 0-201 63446 de 5) capítulo seis: 'Aplicações' Grimes Richard, Professional DCOM de programação . Wrox Press Inc. (ISBN 1-861000-60-X), capítulo 4: 'Distributed Component Object Model' O DCOM Add-in para o Windows 95 é fornecido com o suporte de dados SQL Server 7.0 e o ficheiro chama DCOM95.exe. Pode transferir DCOM95.exe a partir do seguinte Web site:
http://www.microsoft.com/com (http://www.microsoft.com/com)

A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 6.5 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL 2005 Server Enterprise
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL 2005 Server Workgroup
Palavras-chave: 
kbmt kbinfo KB198891 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: 198891  (http://support.microsoft.com/kb/198891/en-us/ )