Een op DLL gebaseerd COM-object buiten het SQL Server-proces uitvoeren

Van toepassing: Microsoft SQL Server 2005 Standard EditionMicrosoft SQL Server 2005 Developer EditionMicrosoft SQL Server 2005 Enterprise Edition

Samenvatting


Microsoft SQL Server 6,5 of hoger biedt de mogelijkheid om aangepaste COM-objecten (Component Object Model) te laden en uit te voeren via een set met een of meer uitgebreide, opgeslagen procedures. Standaard worden op DLL gebaseerde COM-objecten geladen als in process server, wat inhoudt dat de COM-objecten niet alleen worden geladen binnen de adresruimte van het SQL Server-proces, maar dat ze ook volledige toegang hebben tot deze geheugenruimte. Daarom moet een COM-object dat in de SQL Server-procesruimte is geladen, voldoen aan dezelfde regels als een DLL-bestand. Er is een potentieel dat via een COM-objectgeheugen kan worden overschreven in het SQL Server-proces of bronnen voor lekkage vanwege instabiliteit. Als u vermoedt dat een COM-object de robuustheid van het SQL Server-proces nadelig beïnvloedt, kunt u de stappen in dit artikel gebruiken om het COM-object te instantiëren buiten de SQL Server-procesruimte. De implementatie van de DCOM-specificatie (Distributed Component Object Model) van de ' locatie transparantie ' in het besturingssysteem biedt de mogelijkheid om een op DLL-gebaseerd COM-object buiten de SQL Server-procesruimte uit te voeren. Het proces voor het uitvoeren van een op de DLL gebaseerd COM-object buiten de adresruimte van de hoofdtoepassing is Remoting genoemd. Voor externe toegang moet een ander uitvoerbare surrogaatproces worden uitgevoerd in plaats van het uitvoerbare bestand van SQL Server. Het standaarduitvoer bare bestand dat wordt gebruikt door de DCOM service Control Manager (RPCSS. exe) heet Dllhost. exe. De DCOM-ondersteunings structuur gebruikt het Dllhost. exe-bestand om de DLL in de procesruimte te laden en gebruikt vervolgens proxy/stub-paren om de gevraagde interface doorzichtig te bundelen naar de client, wat in dit geval de SQL Server is. Voor dit uitvoerbare bestand kunnen meerdere interface-en methodeaanvragen tegelijk worden geaccepteerd. Wanneer de interface is gebruikt, beheert de DCOM-service (Service beheer) het opschonen en verwijderen van het Dllhost. exe-bestand. COM-objecten behoren niet te verwachten dat er geen informatie over de status van de instantiëring wordt bewaard. Om dit artikel goed te laten werken, moet er een besturingssysteem voor DCOM-ondersteuning worden uitgevoerd. Dit is Microsoft Windows NT 4,0 Service Pack 2 of hoger, Microsoft Windows 98 of Microsoft Windows 95 waarop de DCOM-invoegtoepassing is geïnstalleerd. De volgende stappen kunnen gelden voor elk COM-object op basis van DLL dat wordt gemaakt in de SQL Server-procesruimte, ongeacht of het wordt geïnstantieerd via sp_OACreate of een uitgebreide opgeslagen procedure.

Meer informatie


Hieronder vindt u informatie over de twee basismethoden die u kunt gebruiken om het COM-object te instantiëren. 

Voor COM-clientaanvragen voor extern van het object

Door de manier te wijzigen waarop u het COM-object aanroept, kunt u aanvragen dat het object buiten de adresruimte van SQL Server is gemaakt. 
  • Als het COM-object wordt geladen met behulp van de sp_OACreate procedure, wordt dit standaard in behandeling geladen. Er is echter een optionele derde parameter voor deze procedure die u kunt gebruiken om de context van waar het object kan worden gemaakt, aan te geven. Als deze parameter niet is opgegeven, wordt de standaardinstelling van vijf (5) gebruikt, wat betekent dat u het object binnen of buiten het proces kunt uitvoeren. U moet de parameter wijzigen in vier (4), wat verwijst naar DCOM, zodat dit onderdeel wordt uitgevoerd als een lokaal uitvoerbaar bestand. Gebruik de syntaxis die vergelijkbaar is met het volgende voorbeeld om expliciet aan DCOM te melden dat het COM-object ' uit het proces ' moet worden uitgevoerd met behulp van de sp_OACreate opgeslagen procedure:  
       DECLARE @object int   DECLARE @hr int   EXEC @hr = sp_OACreate 'SQLOLE.SQLServer', @object OUT, 4
  • Als het COM-object binnen een uitgebreide opgeslagen procedure wordt gemaakt, kan de derde parameter van CoCreateInstance of CoCreateInstanceEx worden gewijzigd in CLSCTX_LOCAL_SERVER. Dit wordt weergegeven in de volgende code in het voorbeeld met CoCreateInstance:  
       HRESULT hr = CoCreateInstance(CLSID_Test, NULL, CLSCTX_LOCAL_SERVER,     IID_IUnknown, (void**)&piunknown);

Register wijzigen om Remoting van het object af te dwingen

Als u de COM-client niet kunt wijzigen om aan te vragen of het object in behandeling is gemaakt, bestaan er twee verschillende methoden om het object te laten maken.
  • Gebruik de OLE/COM object Viewer (Oleview. exe) die wordt meegeleverd met Microsoft Visual C++ en zoek de ProgID in de vorm van OLEComponent. object onder alle objecten. Selecteer het COM-object en selecteer vervolgens in het menu object de optie CoCreateInstance vlaggen. Zorg ervoor dat alleen CLSCTX_LOCAL_SERVER is geselecteerd. Selecteer vervolgens onder de tabbladen implementatie en InProc-server de optie surrogaatproces gebruiken en laat het ' pad naar aangepaste surrogaat ' leeg, zodat het bestand Dllhost. exe kan worden geladen en de com dll wordt geladen.
  • Gebruik de volgende stappen om het register handmatig bij te werken. Waarschuwing Als u het register niet meer bewerkt met behulp van de Register-editor of met een andere methode, kunnen er ernstige problemen optreden. Voor deze problemen moet u mogelijk het besturingssysteem opnieuw installeren. Microsoft kan niet garanderen dat deze problemen kunnen worden opgelost. Wijzig het register op eigen risico.
    1. Haal de klasse-identificatie (CLSID) van het COM-object op. De CLSID is een 128-bits nummer en wordt beschouwd als een Globally Unique Identifier (GUID) die wordt gebruikt om het onderdeel, de module of het bestand dat dit COM-object bevat, uniek te identificeren. Wanneer u COM-objecten maakt met behulp van de door OLE automatisering opgeslagen procedures, is de eerste parameter van de opgeslagen procedure een programma-id of de ProgID van het OLE-object dat wordt gebruikt om de CLSID af te maken. Deze tekenreeks beschrijft de klassen van het OLE-object en heeft de volgende vorm:
            OLEComponent.Object 
      U kunt de programma-id gebruiken om de klassen identificatie van een COM-object te zoeken. Open de Register-editor (Regedit. exe) en selecteer onder de HKEY_CLASSES_ROOT sleutel de methode zoeken om een sleutel te zoeken met de naam van de <OLEComponent. object>. U ziet het op andere niveaus, maar het is op het niveau direct onder de HKEY_CLASSES_ROOT. Wanneer u de sleutel hebt gevonden, vouwt u de map voor de naam van de sleutel uit en ziet u een subsleutel met de naam CLSID. Klik op die map om de waarden in die sleutel weer te geven. Aan de rechterkant van het scherm is de naam ' (standaard) '. De gegevens voor die sleutel moeten in de volgende formulieren staan:  
            {59F929A0-74D8-11D2-8CBC-08005A390B09} 
      Maak een notitie van deze waarde of kopieer deze naar Kladblok. Neem de haken op.
    2. Ga naar de \CLSID-code van HKEY_CLASSES_ROOT en zoek de subsleutel met deze GUID. Nadat u HKEY_CLASSES_ROOT de \CLSID-toets hebt gemarkeerd, kunt u de functie zoeken in de Register-editor (onder het menu bewerken ) gebruiken en de GUID plakken in het dialoogvenster zoeken . Zorg ervoor dat u de juiste interface hebt gevonden door de InprocServer32-subsleutel onder deze sleutel te controleren, die verwijst naar de locatie van het DLL-bestand voor COM. Als er een TypeLib-sleutel is, controleert u deze GUID-waarde. Dit moet afwijken van de inhoud die u in stap 1 hebt vermeld. Anders hebt u de TypeLib-GUID en niet de GUID voor het COM-object. De subsleutel ProgID heeft de waarde ' OLEComponent. object. 1 '. De een aan de kant eindigt alleen voor dit voorbeeld en wordt gebruikt voor versiegegevens.
    3. Zorg ervoor dat onder de InprocServer32-subsleutel van de GUID een ThreadingModel-waarde bestaat en dat deze is ingesteld op beide of gratis, zodat u zeker weet dat de marshaling het thread-model van het COM-object begrijpt om te zorgen dat COM niet wordt uitgevoerd tijdens de uitvoering van de SQL Server-procesruimte. Als er geen ThreadingModel waarde is of als dit is ingesteld op Apartment, mag COM-object instantiër niet consistent zijn. Opmerking Als u de ThreadingModel-waarde toevoegt, moet u ervoor zorgen dat u uw COM-object test voordat u deze implementeert.
    4. Markeer de GUID-nummer/-subsleutel onder de sleutel HKEY_CLASSES_ROOT \CLSID. Selecteer in het menu bewerken de optie Nieuwen selecteer tekenreekswaarde. Typ onder de kolom naam het volgende:
      AppID
    5. Druk op Enter en voeg de klassen-id of het GUID-nummer in dat u bij stap 1 hebt genoteerd als de waarde. De GUID moet zich in de accolade bevinden, zoals in het volgende voorbeeld:  
             {59F929A0-74D8-11D2-8CBC-08005A390B09}  
      De Application Identifier AppID wordt door DCOM gebruikt om de DLL te koppelen aan een uitvoerbaar bestand.
    6. Voeg een nieuwe subsleutel toe onder de HKEY_CLASSES_ROOT \AppID en stel deze in op dezelfde klasse-id of GUID-nummer met de vierkante haken die u in de vorige stap hebt ingevoegd.
    7. Markeer de GUID-naam. Selecteer in het menu bewerken de optie Nieuwen selecteer tekenreekswaarde. Typ onder de kolom naam het volgende:  
      DllSurrogate
      Laat de gegevens kolom leeg voor deze waarde. Omdat de gegevenskolom leeg is, wordt in DCOM het standaarduitvoer bare bestand uitgevoerd, Dllhost. exe en het COM-object binnen de procesruimte laden.
    8. Sluit de Register-editor. Klik op Start en vervolgens op Uitvoeren. Typ het volgende in het dialoogvenster uitvoeren :  
      DCOMCNFG
      Druk op Enter om het dialoogvenster Distributed COM Configuration Properties te openen. Klik op het tabblad standaardeigenschappen en zorg ervoor dat Distributed COM inschakelen op deze computer is geselecteerd. Als dat niet het geval is, selecteert u het en klikt u op toepassen.
    9. Zorg ervoor dat het Microsoft Windows NT-gebruikersaccount waarmee SQL Server wordt uitgevoerd, de machtiging Volledig beheer heeft voor de registersleutels voor dit object. Als de machtigingen niet voldoende zijn of als de registersleutels juist worden ingevoerd, kunnen de volgende fouten optreden wanneer u het COM-object maakt:  
      Informatie over OLE-automatiseringsfouten HRESULT: 0x80040154 Bron: ODSOLE uitgebreide procedure Beschrijving: klasse niet geregistreerd Informatie over OLE-automatiseringsfouten HRESULT: 0x80070005 Bron: ODSOLE uitgebreide procedure Beschrijving: de toegang is geweigerd. Informatie over OLE-automatiseringsfouten HRESULT: 0x80080005 Bron: ODSOLE uitgebreide procedure Beschrijving: Server uitvoering mislukt
    10. Test en kijk of het bestand Dllhost. exe wordt uitgevoerd en het COM-object in de procesruimte wordt geladen. Hiervoor moet de Microsoft Windows-Resource Kit op de Windows NT-computer staan waarop SQL Server wordt uitgevoerd. Open een opdrachtprompt en voer het bestand Tlist. exe uit met de opdrachtprompt en voer het programma Tlist. exe uit, met alle processen en de bijbehorende proces-id's, of proces-Id's. In het Transact-SQL-script waar sp_OACreate wordt uitgevoerd en nadat het gesprek is uitgevoerd, maar voordat het script eindigt, kunt u als volgt de voltooiing van een script uitstellen:  
      WAITFOR DELAY '000:00:20'
      Voer het script uit en ga direct naar de opdrachtprompt en voer het bestand Tlist. exe uit. Let op de PID van Dllhost. exe. Voer Tlist. exe opnieuw uit en geef een PID als parameter. Hier ziet u de Dll's die worden geladen binnen de procesruimte Dllhost. exe. Het COM-object dat op de DLL wordt uitgevoerd, moet worden weergegeven in dit proces. Nadat het resultaat is geretourneerd, voert u opnieuw Tlist. exe uit, wordt het Dllhost. exe-proces niet langer uitgevoerd. In het volgende voorbeeld wordt het ADODB. Connection-object wordt gemaakt buiten de SQL Server-procesruimte. Deze momentopname met Tlist. exe is uitgevoerd terwijl het COM-object bestaat in de procesruimte van Dllhost. exe. U ziet dat de module msado15. dll, de module die het COM-object bevat, wordt geladen.  
      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
      Met SQL Server versie 7,0 Desktop Edition die wordt uitgevoerd op Microsoft Windows 95 of Microsoft Windows 98-werkstations, kunnen de ' 32-bits modules die in het programma Microsoft systeeminformatie worden geladen ' worden gebruikt tijdens de uitvoering om de loading\unloading van het Dllhost. exe-bestand en de DLL van het COM-object tijdens deze test te zien. Als u het hulpprogramma wilt gebruiken, klikt u op Start, wijst u Programma'saan, wijst u Bureau-accessoiresaan en klikt u vervolgens op systeemhulpprogramma's.
Opmerking Vanwege beveiligingsbeperkingen biedt Windows 95 of Windows 98 geen ondersteuning voor het starten van een DLLSurrogate proces en het laden van een COM-DLL door een externe client. Daarom moet het COM-object bestaan binnen de object tabel (ROT) en worden uitgevoerd/geladen als het beschikbaar moet zijn voor gebruik door een externe clientcomputer. Met behulp van de stappen in dit artikel kunt u COM-objecten isoleren wanneer deze worden verdacht op de SQL-Server. Zorg ervoor dat elk onderdeel is getest om consistent gedrag te bieden. Prestatie verschil in het concretiseren van een COM-object in het SQL Server-proces en buiten de procesruimte, varieert. Daarnaast werden sommige COM-objecten niet gebouwd en kunnen ze bronnen lekt. Test uitgebreid voordat u de stappen in dit artikel voor iets anders dan een stap voor het oplossen van problemen implementeert. Het volgende Microsoft Knowledge Base-artikel bevat een voorbeeld van de manier waarop Remoting van een COM-object een bron lekt kan veroorzaken:
197426 OPLOSSING: geheugenlek tijdens het doorgeven van ADO-objecten tussen processen 
Opmerking Microsoft SQL Server 6,5, standaard wordt gebruikt met het model voor één thread Apartment (STA) en beheert de initialisatie van COM-objecten in een afzonderlijke interne thread. In dit model is één thread geselecteerd voor het regelen van het maken van alle OLE-objecten in het SQL Server-proces en voor het opnieuw instellen van de proxy voor alle clientverbindingen waarvoor toegang tot dit COM-object is vereist. Aangezien dit intern wordt verwerkt door de SQL Server, kan de persistentie van het object niet worden gegarandeerd tussen de activeringen van het COM-object. 

Verwijzingen


Klik voor meer informatie over het SQL Server 6,5 COM-object model op het volgende artikelnummer om het artikel in de Microsoft Knowledge Base weer te geven:
194661 Permanente SQL Server-object
Als u meer wilt weten over de manier waarop Sp_OA opgeslagen procedure wordt geïmplementeerd, klikt u op het volgende artikelnummer om het artikel in de Microsoft Knowledge Base weer te geven:
180780 De werking van Sp_OA procedure-uitbreiding voor SQL Server
Meer informatie over het uitvoeren van COM-objecten met DLL binnen DLL-surrogaat. Ga naar het volgende: Eddon, Guy; Eddon Henry, binnen Distributed COM (MPS). Microsoft Press, 1998, (ISBN 1-57231-849-X), hoofdstuk acht: ' DLL surrogaat en uitvoerbare Components'Box, Daan, essentieel com. Addison-Wesley Pub. Mede., (ISBN 0-201-63446-5) hoofdstuk zes: ' toepassingen ' Grimes, Richard, professionele DCOM-programmering. Wrox Press Inc. (ISBN 1-861000-60-X), hoofdstuk vier: ' Distributed Component Object Model ' de DCOM-invoegtoepassing voor Windows 95 wordt geleverd met de SQL Server 7,0-media en het bestand heeft de naam DCOM95. exe. U kunt DCOM95. exe downloaden van de volgende website: