Köra ett DLL-baserat COM-objekt utanför SQL Server-processen

Gäller för: Microsoft SQL Server 2005 Standard EditionMicrosoft SQL Server 2005 Developer EditionMicrosoft SQL Server 2005 Enterprise Edition

Sammanfattning


Microsoft SQL Server 6,5 eller senare innehåller funktioner för att läsa in och köra anpassade COM-objekt (Component Object Model) via en uppsättning lagrade procedurer för OLE automation eller genom utökade lagrade procedurer. Som standard laddas DLL-baserade COM-objekt som på process Server, vilket innebär att COM-objekten inte endast är inlästa i SQL Server process Memory-adress utrymmet, men att de har full till gång till det här minnes adress utrymmet. Därför måste ett COM-objekt som lästs in i SQL Server process utrymme följa samma regler som alla DLL-filer. Det finns en potential att ett COM-objekt kan skriva över minnet i SQL Server-processen eller läcker resurser, vilket orsakar instabilitet. Om det misstänks att ett COM-objekt kan påverka stabiliteten i SQL Server-processen kan du använda stegen i den här artikeln för att instansiera COM-objekt utanför SQL Server process-rymden. Implementering av specifikationen för DCOM (Distributed Component Object Model) för "plats genomskinlighet" i operativ systemet har visat förmågan att köra ett DLL-baserat COM-objekt utanför SQL Server process-rymden. Processen med att köra ett DLL-baserat COM-objekt utanför adress utrymmet för huvud programmet kallas för fjärr kommunikation. För fjärr kommunikation krävs att en annan körbar fil är en surrogat process i stället för den körbara SQL-servern. Den körbara filen för DCOM-tjänsten (RPCSS. exe) heter Dllhost. exe. I strukturen stöd för DCOM används filen Dllhost. exe för att ladda DLL: en i sitt process utrymme och sedan används proxy/stub-par för att konvertera det begärda gränssnittet transparent tillbaka till klienten, som i det här fallet är SQL Server. Denna körbara fil kan acceptera flera gränssnitt/metod förfrågningar samtidigt. När gränssnitts användningen är färdig hanterar tjänsten för DCOM-tjänsthanteraren rensning och lossning av filen Dllhost. exe. COM-objekt ska inte förväntas vara bevarade för att behålla tillståndsinformation i mellan instansieringen. För att den här artikeln ska fungera korrekt måste systemet köra ett DCOM-aktiverat operativ system. Detta skulle vara Microsoft Windows NT 4,0 Service Pack 2 eller senare, Microsoft Windows 98 eller Microsoft Windows 95 med DCOM-tillägget installerat. Följande steg gäller för alla DLL-baserade COM-objekt som skapas i SQL Server process-rymden, oavsett om den instansieras genom sp_OACreate eller en utökad lagrad procedur.

Mer information


Information om de två grundläggande metoderna som du kan använda för att instansiera COM-objekt utanför processen. 

COM-klient begär fjärr kommunikation för objektet

Genom att ändra hur du anropar COM-objekt kan du begära att objektet skapas utanför adress utrymmet i SQL Server. 
  • Om COM-objektet laddas med hjälp av sp_OACreate proceduren laddas det som standard in i process. Men det finns en valfri tredje parameter i den här proceduren som kan användas för att ange var objektet ska skapas. Om den här parametern inte anges används standardinställningen för fem (5), vilket betyder att objektet ska köras antingen inuti eller utanför processen. Du måste ändra parametern till fyra (4), vilket betyder DCOM som den här komponenten körs som en lokal körbar fil. Använd syntax som liknar följande exempel för att explicit informera DCOM för att köra COM-objektet "utanför processen" med sp_OACreate lagrade proceduren:  
       DECLARE @object int   DECLARE @hr int   EXEC @hr = sp_OACreate 'SQLOLE.SQLServer', @object OUT, 4
  • Om COM-objektet skapas i en utökad lagrad procedur kan den tredje parametern för CoCreateInstance eller CoCreateInstanceEx ändras till CLSCTX_LOCAL_SERVER. Detta visas i följande kod exempel med hjälp av CoCreateInstance:  
       HRESULT hr = CoCreateInstance(CLSID_Test, NULL, CLSCTX_LOCAL_SERVER,     IID_IUnknown, (void**)&piunknown);

Ändra registret för att framtvinga fjärr kommunikation för objektet

Om du inte kan ändra COM-klienten för att begära att objektet skapas utanför processen, finns det två olika metoder för att tvinga objektet att skapas utanför processen.
  • Använd OLE/COM-visningsprogrammet (Oleview. exe) som medföljer Microsoft Visual C++ och leta reda på ProgID i formatet OLEComponent. Object under alla objekt. Markera COM-objektet och välj sedan CoCreateInstance-flaggorfrån menyn objekt . Kontrol lera att endast CLSCTX_LOCAL_SERVER är markerat. Klicka sedan på Använd surrogat process på flikarna implementering och InProc Server och lämna sökvägen till anpassat surrogat tomt, vilket gör att filen Dllhost. exe laddas och com-dll ingick i det här steget.
  • Följ stegen nedan om du vill uppdatera registret manuellt. Varning Allvarliga problem kan uppstå om du ändrar registret felaktigt med Registereditorn eller med en annan metod. Dessa problem kan kräva att du installerar om operativ systemet. Microsoft kan inte garantera att dessa problem kan lösas. Ändra registret på egen risk.
    1. Skaffa klass-ID (CLSID) för COM-objektet. CLSID är ett 128-bitars nummer och betraktas som ett globalt unikt ID (GUID) som används för att identifiera den komponent, modul eller fil som innehåller detta COM-objekt. När du skapar COM-objekt med lagrade procedurer för OLE-automatisering är den första parametern till den lagrade proceduren ett programmatiskt ID eller ProgID för OLE-objektet som används för att härleda CLSID. Den här tecken strängen beskriver OLE-objektets klass och har följande format:
            OLEComponent.Object 
      Du kan använda programmatiska ID för att hitta klass-ID för ett COM-objekt. Öppna Registereditorn (regedit. exe) och gå till HKEY_CLASSES_ROOT nyckel och leta reda på en nyckel med namnet på <OLEComponent. Object>. Du hittar den på andra nivåer, men den bör finnas på nivån direkt under HKEY_CLASSES_ROOT. När du har hittat nyckeln expanderar du mappen för nyckel namnet så visas en under nyckel med namnet CLSID. Klicka på mappen för att visa värdena i den tangenten. Till höger på skärmen finns rubriken "(standard)". Data för den tangenten ska vara i följande format:  
            {59F929A0-74D8-11D2-8CBC-08005A390B09} 
      Anteckna det här värdet eller kopiera det till anteckningar. Ta med parenteser.
    2. Navigera under HKEY_CLASSES_ROOT \CLSID-nyckeln och leta reda på under nyckeln med detta GUID-nummer. När du har markerat HKEY_CLASSES_ROOT \CLSID-tangenten kan du använda funktionen Sök i Registereditorn (under menyn redigering ) och klistra in GUID i dialog rutan Sök . Kontrol lera att du har hittat rätt gränssnitt genom att inspektera InprocServer32 under den här nyckeln, som pekar på COM-filens plats. Om det finns en TypeLib-Key kontrollerar du detta GUID-värde. Det bör skilja sig från det du noterade i steg 1. Annars har du TypeLib-GUID och inte GUID för COM-objektet. ProgID-undernyckeln kommer att ha värdet ' OLEComponent. Object. 1 '. Det här är endast för det här exemplet och används för versions information.
    3. När du befinner dig under GUID-InprocServer32-under nyckeln kontrollerar du att ett ThreadingModel-värde finns och att det är inställt på antingen både eller gratis för att säkerställa att konverteringen förstår tråd körnings modellen för COM-objektet för att tillåta COM-körning från SQL Server process Space. Om det inte finns ett ThreadingModel-värde eller om det är inställt på Apartment kanske inte instansiering av COM-objekt stämmer. Obs! Om du lägger till ThreadingModel-värdet ska du testa COM-objektet innan du implementerar det.
    4. Markera GUID-nummer/under nyckel under nyckeln HKEY_CLASSES_ROOT \CLSID. På Redigera -menyn klickar du på nyttoch väljer sedan sträng värde. Skriv följande under kolumnen namn :
      AppID
    5. Tryck på RETUR och infoga sedan klass-ID eller GUID-nummer som du angav i steg 1 som värde. GUID ska ligga inom klammerparenteserna enligt följande exempel:  
             {59F929A0-74D8-11D2-8CBC-08005A390B09}  
      Program-ID AppID används av DCOM för att koppla DLL-filen till en körbar fil.
    6. Lägg till en ny under nyckel under HKEY_CLASSES_ROOT \AppID och ange namnet till samma klass identifierare eller GUID-nummer med parenteserna som infogats i föregående steg.
    7. Markera GUID-namnet. På Redigera -menyn klickar du på nyttoch väljer sedan sträng värde. Skriv följande under kolumnen namn :  
      DllSurrogate
      Lämna data kolumnen tom för det här värdet. Eftersom data kolumnen är tom, informerar DCOM om att kör den körbara filen Dllhost. exe och ladda COM-objekt i det bearbetade området.
    8. Stäng Registereditorn. Klicka på Start och därefter på Kör. Skriv följande i dialog rutan Kör :  
      DCOMCNFG
      Tryck på RETUR för att öppna dialog rutan Egenskaper för distribuerad com-konfiguration . Klicka på fliken standard egenskaper och kontrol lera att Aktivera distribuerad com på den här datorn är markerat. Om det inte gör det markerar du det och klickar sedan på Använd.
    9. Kontrol lera att Microsoft Windows NT-användarkontot som SQL Server körs under har "fullständig behörighet" för det här objektet. Om behörigheterna inte är tillräckliga eller om register nycklarna är felaktigt angivna kan följande fel inträffa när du skapar COM-objekt:  
      Fel information för OLE-automation HRESULT: 0x80040154 Källa: ODSOLE Extended procedur Beskrivning: klassen är inte registrerad Fel information för OLE-automation HRESULT: 0x80070005 Källa: ODSOLE Extended procedur Beskrivning: åtkomst nekad. Fel information för OLE-automation HRESULT: 0x80080005 Källa: ODSOLE Extended procedur Beskrivning: Server körning misslyckades
    10. Testa och se om filen Dllhost. exe körs och COM-objektet laddas i dess process utrymme. Detta kräver att Microsoft Windows NT Resource Kit finns på den Windows NT-dator där SQL Server körs. Öppna en kommando tolk och gå till kommando tolken och kör filen TList. exe, som visar alla processer och deras tillhör ande process-ID: n. I Transact-SQL-skriptet där sp_OACreate körs och när det här samtalet körs, men innan skriptet avslutas, ska du använda följande för att fördröja slut för ande av skript för ytterligare 20 sekunder:  
      WAITFOR DELAY '000:00:20'
      Kör skriptet och gå direkt till kommando tolken och kör filen TList. exe. Observera filen Dllhost. exe. Kör om TList. exe och överför PID som en parameter. Då visas de DLL-filer som är inlästa i process utrymmet Dllhost. exe. Det DLL-baserade COM-objektet ska finnas med i listan som körs i den här processen. När skriptet returnerar, visar TList. exe igen att Dllhost. exe-processen inte längre körs. I följande exempel skriver du ett ADODB. Anslutningsobjektet skapas utanför SQL Server process-rymden. Denna ögonblicks bild med TList. exe utfördes när COM-objektet fanns i Dllhost. exe-process utrymmet. Observera att modul Msado15. dll, som är den modul som innehåller COM-objektet, laddas.  
      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
      Med SQL Server version 7,0 Desktop Edition som körs på Microsoft Windows 95 eller Microsoft Windows 98-arbets stationer kan de "32-bits-moduler som laddats" i verktyget Microsoft system information Application användas under körningen för att se loading\unloading i filen Dllhost. exe och COM Object DLL under det här testet. Du kommer åt verktyget genom att klicka på Start, peka på program, peka på tillbehöroch sedan klicka på system verktyg.
Obs! På grund av säkerhets begränsningar kan Windows 95 eller Windows 98 inte starta en DLLSurrogate-process och ladda en COM-DLL-fil av en fjärran sluten klient. Därför måste COM-objektet finnas i den aktiva objekt tabellen (RÖTANGREPP) och körs/laddas om det är tillgängligt för användning av en fjärrdator. Du kan använda stegen i den här artikeln för att hjälpa till att isolera COM-objekt när de misstänks vara orsak till instabilitet i SQL Server. Kontrol lera att varje komponent testas grundligt för att det ska fungera. Prestanda skillnader vid instansiering av ett COM-objekt i SQL Server-processen och utanför process utrymmet varierar. Vissa COM-objekt har inte skapats för fjärr anslutning och kan läcker resurser. Testa noga innan du implementerar stegen i den här artikeln för något annat än ett fel söknings steg. I följande Microsoft Knowledge Base-artikel finns ett exempel på hur fjärrsamtal kan orsaka resurs läckor i ett COM-objekt:
197426 ÅTGÄRD: handtag för att hantera ADO-objekt mellan processer 
Obs! Microsoft SQL Server 6,5, som standard, fungerar med STA-modellen (Single Thread Apartment) och hanterar initiering av COM-objekt på en separat intern tråd. I den här modellen är en tråd markerad för att styra skapandet av alla OLE-objekt i SQL Server-processen och för att återställas till alla klient anslutningar som kräver åtkomst till detta COM-objekt. Eftersom detta hanteras internt av SQL-servern kan objektets persistence inte garanteras mellan Instansieringen av COM-objekt. 

Referenser


Om du vill veta mer om COM-modellen för SQL Server 6,5 klickar du på följande artikel nummer och läser artikeln i Microsoft Knowledge Base:
194661 SQL Server-persistence för COM-objekt
Om du vill ha mer information om hur Sp_OA lagrade proceduren implementerar klickar du på följande artikel nummer och läser artikeln i Microsoft Knowledge Base:
180780 Så här implementeras tillägget för Sp_OA procedurer i SQL Server
Mer information om hur du kör DLL-baserade COM-objekt i DLL-surrogat; Se följande: Eddon, Guy; Eddon Henry, i distribuerad com (MPS). Microsoft Press, 1998, (ISBN 1-57231-849-X), kapitel åtta: ' DLL-surrogat och Executable Components'Box, Dan, viktigt com. Addison-Wesley pub. Co., (ISBN 0-201-63446-5) kapitel sex: ' program ' Grimes, Richard, Professional DCOM-programmering. Wrox press Inc. (ISBN 1-861000-60-X), kapitel fyra: "Distributed Component Object Model" DCOM-tillägget för Windows 95 levereras med SQL Server 7,0-mediet och filen heter Dcom95. exe. Du kan ladda ned Dcom95. exe från följande webbplats: