Jak uruchomić obiekt COM oparty na bibliotece DLL poza procesem programu SQL Server

Dotyczy: Microsoft SQL Server 2005 Standard EditionMicrosoft SQL Server 2005 Developer EditionMicrosoft SQL Server 2005 Enterprise Edition

Podsumowanie


Program Microsoft SQL Server 6,5 lub nowszy umożliwia ładowanie i uruchamianie obiektów COM (Custom Component Object Model) za pośrednictwem zestawu procedur składowanych funkcji automatyzacji OLE lub rozszerzonych procedur składowanych. Domyślnie obiekty COM oparte na bibliotece DLL są ładowane jako serwery przetwarzania, co oznacza, że obiekty COM nie są ładowane tylko w obszarze adresów pamięci procesu programu SQL Server, ale mają pełny dostęp do tej przestrzeni adresowej w pamięci. Dlatego obiekt COM załadowany w obszarze procesu programu SQL Server musi być zgodny z takimi samymi regułami jak dowolny plik DLL. Istnieje prawdopodobieństwo, że obiekt COM może zastąpić pamięć w ramach procesu programu SQL Server lub zasoby przecieków, powodując niestabilność. Jeśli istnieje podejrzenie, że obiekt COM może mieć wpływ na niezawodność procesu programu SQL Server, warto wykonać czynności opisane w tym artykule w celu utworzenia wystąpienia obiektu COM poza obszarem procesu programu SQL Server. Wdrożenie modelu DCOM (Distributed Component Object Model) w systemie operacyjnym zapewnia możliwość uruchamiania obiektu COM opartego na bibliotece DLL poza obszarem procesu programu SQL Server. Proces uruchamiania obiektu COM opartego na bibliotece DLL poza przestrzenią adresową aplikacji głównej jest nazywany obsługą zdalną. Komunikacja zdalna wymaga, aby inny plik wykonywalny był procesem zastępczym zamiast pliku wykonywalnego programu SQL Server. Domyślnym plikiem wykonywalnym wykorzystywanym przez Menedżera sterowania usługami DCOM (RPCSS. exe) jest nazwa dllhost. exe. Struktura obsługi modelu DCOM używa pliku dllhost. exe do załadowania biblioteki DLL do jej obszaru przetwarzania, a następnie korzysta z par serwer proxy/stub, aby zorganizować żądany interfejs z powrotem do klienta, co w tym przypadku jest programem SQL Server. Ten plik wykonywalny może jednocześnie akceptować wiele żądań interfejsu/metody. Po zakończeniu korzystania z interfejsu Menedżer sterowania usługami DCOM (SCM, Service Control Manager) zarządza oczyszczaniem i rozładowywaniem pliku dllhost. exe. Obiekty COM nie powinny być oczekiwane zachowywanie informacji o stanie między wystąpieniami. Aby ten artykuł działał poprawnie, w systemie musi być uruchomiony system operacyjny obsługujący model DCOM. Może to być Microsoft Windows NT 4,0 z dodatkiem Service Pack 2 lub nowszym, Microsoft Windows 98 lub Microsoft Windows 95 z zainstalowanym dodatkiem DCOM. Poniższe czynności mogą dotyczyć dowolnego obiektu COM opartego na bibliotece DLL tworzonego w obszarze procesu programu SQL Server, niezależnie od tego, czy jest on tworzony w oparciu o sp_OACreate , czy rozszerzona procedura składowana.

Więcej informacji


Informacje na temat dwóch podstawowych metod, których można użyć w celu utworzenia wystąpienia obiektu COM znajdującego się w trakcie procesu. 

Klient COM żąda komunikacji zdalnej obiektu

Zmieniając sposób wywoływania obiektu COM, możesz poprosić o utworzenie obiektu poza obszarem adresów w programie SQL Server. 
  • Jeśli obiekt COM jest ładowany przy użyciu procedury sp_OACreate , domyślnie jest on ładowany w trakcie procesu. Jednak w tej procedurze jest dostępny Opcjonalny trzeci parametr, który może być używany do wskazywania kontekstu tworzenia obiektu. Jeśli ten parametr nie jest określony, zostanie użyte ustawienie domyślne z pięciu (5), co oznacza, że obiekt ma być uruchomiony albo poza procesem. Należy zmienić wartość parametru na cztery (4), co oznacza, że model DCOM jest używany jako lokalny plik wykonywalny. Użyj składni podobnej do poniższego przykładu, aby jawnie poinformować model DCOM o uruchomieniu obiektu COM "poza procesem" przy użyciu sp_OACreate procedury przechowywanej:  
       DECLARE @object int   DECLARE @hr int   EXEC @hr = sp_OACreate 'SQLOLE.SQLServer', @object OUT, 4
  • Jeśli obiekt COM został utworzony w ramach rozszerzonej procedury składowanej, można zmienić trzeci parametr funkcji CoCreateInstance lub CoCreateInstanceEx na CLSCTX_LOCAL_SERVER. Jest ona wyświetlana w poniższym przykładzie kodu przy użyciu funkcji CoCreateInstance:  
       HRESULT hr = CoCreateInstance(CLSID_Test, NULL, CLSCTX_LOCAL_SERVER,     IID_IUnknown, (void**)&piunknown);

Modyfikowanie rejestru w celu wymuszenia komunikacji zdalnej obiektu

Jeśli nie można zmodyfikować klienta COM w celu zażądania utworzenia obiektu poza procesem, istnieją dwie różne metody wymuszania utworzenia obiektu w trakcie tworzenia.
  • Użyj przeglądarki OLE/COM Object Viewer (OleView. exe) dostarczanej z programem Microsoft Visual C++ i Znajdź identyfikator ProgID w postaci OLEComponent. Object w obszarze wszystkie obiekty. Wybierz obiekt COM, a następnie w menu obiekt wybierz polecenie CoCreateInstance flags. Upewnij się, że jest zaznaczona pozycja tylko CLSCTX_LOCAL_SERVER. Następnie w obszarze karty serwera implementacji i InProc wybierz pozycję Użyj procesu surogatu i pozostaw puste pole "ścieżka do niestandardowego surogatu", co umożliwi załadowanie pliku dllhost. exe i biblioteki DLL com, w której znajduje się miejsce przetwarzania.
  • Wykonaj poniższe czynności, aby ręcznie zaktualizować rejestr. Ostrzeżenie Błędy popełnione podczas modyfikowania rejestru przy użyciu Edytora rejestru lub innej metody mogą być przyczyną poważnych problemów. Problemy te mogą spowodować konieczność ponownej instalacji systemu operacyjnego. Firma Microsoft nie może zagwarantować, że rozwiązanie tych problemów będzie możliwe. Rejestr można modyfikować na własną odpowiedzialność.
    1. Uzyskaj identyfikator klasy (CLSID) obiektu COM. Identyfikator CLSID to 128-bitowa liczba i jest traktowana jako unikatowy identyfikator globalny (GUID) służąca do jednoznacznego identyfikowania składnika, modułu lub pliku zawierającego ten obiekt COM. Podczas tworzenia obiektów COM za pomocą procedur składowanych funkcji automatyzacji OLE pierwszy parametr procedury składowanej jest identyfikatorem programistycznym lub atrybutem ProgID obiektu OLE jest używany do uzyskania identyfikatora CLSID. Ten ciąg znaków zawiera opis klasy obiektu OLE i ma następującą postać:
            OLEComponent.Object 
      Identyfikatora programistycznego można użyć w celu znalezienia identyfikatora zajęć dla obiektu COM. Otwórz Edytor rejestru (regedit. exe) i w kluczu HKEY_CLASSES_ROOT Użyj metody Find , aby zlokalizować klucz o nazwie <OLEComponent. Object>. Znajdziesz go na innych poziomach, ale należy go umieścić na poziomie bezpośrednio poniżej HKEY_CLASSES_ROOT. Po znalezieniu klucza rozwiń folder nazwy klucza i powinien być widoczny podklucz o nazwie CLSID. Kliknij ten folder, aby wyświetlić wartości w tym kluczu. Po prawej stronie ekranu jest to tytuł o nazwie "(domyślny)". Dane dla tego klucza powinny mieć następującą postać:  
            {59F929A0-74D8-11D2-8CBC-08005A390B09} 
      Zanotuj tę wartość lub skopiuj ją do Notatnika. Uwzględnij nawiasy klamrowe.
    2. Przejdź pod HKEY_CLASSES_ROOT klucz \CLSID i Znajdź podklucz o tym numerze GUID. Po wyróżnieniu klucza HKEY_CLASSES_ROOT \CLSID możesz użyć funkcji Znajdź w Edytorze rejestru (w menu Edycja ) i wkleić identyfikator GUID w oknie dialogowym Znajdowanie . Upewnij się, że został znaleziony odpowiedni interfejs, Przeprowadź inspekcję podklucza InprocServer32 poniżej tego klucza, który wskazuje lokalizację pliku DLL modelu COM. Jeśli istnieje klucz TypeLib, sprawdź wartość tego identyfikatora GUID. To powinno być inne niż zanotowane w kroku 1. W przeciwnym razie masz identyfikator GUID biblioteki TypeLib, a nie identyfikator GUID obiektu COM. Podklucz ProgID ma wartość "OLEComponent. Object. 1". Ta próbka na końcu dotyczy tylko tego przykładu i jest używana do przechowywania informacji o wersji.
    3. W podkluczu InprocServer32 GUID należy upewnić się, że istnieje wartość ThreadingModel i że jest ona ustawiana zarówno na poziomie, jak i za darmo, aby upewnić się, że kierowanie Określa model wątkowy obiektu COM, aby umożliwić wykonanie operacji na programie SQL Server z miejscami na zewnątrz. Jeśli nie ma wartości ThreadingModel lub jest ustawiona na Apartment, tworzenie wystąpienia obiektu COM może nie być spójne. Uwaga Jeśli dodasz wartość ThreadingModel, upewnij się, że obiekt COM został przetestowany przed implementacją.
    4. Wyróżnij numer GUID/podklucz pod HKEY_CLASSES_ROOT klucz \CLSID. W menu Edycja kliknij pozycję Nowy, a następnie wybierz pozycję wartość ciągu. W kolumnie name (nazwa ) wpisz następujące polecenie:
      AppID
    5. Naciśnij klawisz Enter , a następnie Wstaw identyfikator klasy lub numer GUID wskazany w kroku 1 jako wartość. Identyfikator GUID powinien znajdować się w nawiasach klamrowych, tak jak w poniższym przykładzie:  
             {59F929A0-74D8-11D2-8CBC-08005A390B09}  
      Identyfikator AppID (Identyfikator aplikacji) jest wykorzystywany przez model DCOM w celu skojarzenia biblioteki DLL z plikiem wykonywalnym.
    6. Dodaj nowy podklucz pod HKEY_CLASSES_ROOT \AppID i nadaj mu nazwę tego samego identyfikatora lub numeru GUID nawiasami, które zostały wstawione w poprzednim kroku.
    7. Wyróżnij nazwę GUID. W menu Edycja kliknij pozycję Nowy, a następnie wybierz pozycję wartość ciągu. W kolumnie name (nazwa ) wpisz następujące polecenie:  
      DllSurrogate
      Pozostaw pustą kolumnę danych dla tej wartości. Ponieważ kolumna danych jest pusta, powoduje to, że funkcja DCOM umożliwia uruchomienie domyślnego pliku wykonywalnego, dllhost. exe, a następnie załadowanie obiektu COM w obrębie obszaru przetwarzania.
    8. Zamknij Edytor rejestru. Kliknij przycisk Start, a następnie kliknij polecenie Uruchom. W oknie dialogowym Uruchamianie wpisz następujące polecenie:  
      ZNAJDUJE
      Naciśnij klawisz Enter , aby otworzyć okno dialogowe Właściwości konfiguracji modelu DCOM. Kliknij kartę właściwości domyślne i upewnij się, że jest zaznaczona pozycja Włącz model DCOM na tym komputerze . Jeśli nie, zaznacz ją, a następnie kliknij przycisk Zastosuj.
    9. Upewnij się, że konto użytkownika systemu Microsoft Windows NT, na którym jest uruchomiony program SQL Server, ma uprawnienie "Pełna kontrola" dotyczące kluczy rejestru dla tego obiektu. Jeśli uprawnienia nie są wystarczające lub klucze rejestru nie są prawidłowo wprowadzane, podczas tworzenia obiektu COM mogą wystąpić następujące błędy:  
      Informacje o błędzie automatyzacji OLE HRESULT: 0x80040154 Źródło: procedura ODSOLE Extended Opis: niezarejestrowana Klasa Informacje o błędzie automatyzacji OLE HRESULT: 0x80070005 Źródło: procedura ODSOLE Extended Opis: odmowa dostępu. Informacje o błędzie automatyzacji OLE HRESULT: 0x80080005 Źródło: procedura ODSOLE Extended Opis: wykonanie serwera nie powiodło się
    10. Przetestuj i sprawdź, czy jest uruchomiony plik dllhost. exe i ładujący obiekt COM w swoim obszarze przetwarzania. Wymaga to zainstalowania zestawu Microsoft Windows NT Resource Kit na komputerze z systemem Windows NT, na którym jest uruchomiony program SQL Server. Otwórz wiersz polecenia i w wierszu polecenia Uruchom plik tlist. exe, w którym są wyświetlane wszystkie procesy i identyfikatory procesów oraz identyfikatory procesów (PID). W skrypcie Transact-SQL, w którym jest uruchamiany sp_OACreate i po wykonaniu tej rozmowy, ale przed zakończeniem działania skryptu, Użyj poniższych opcji, aby opóźnić ukończenie skryptu przez dodatkowe 20 sekund:  
      WAITFOR DELAY '000:00:20'
      Uruchom skrypt i natychmiast przejdź do wiersza polecenia i uruchom plik tlist. exe. Zanotuj identyfikator PID pliku dllhost. exe. Uruchom ponownie program tlist. exe i przekaż Identyfikator PID jako parametr. Spowoduje to wyświetlenie bibliotek DLL załadowanych w ramach przestrzeni procesowej dllhost. exe. Obiekt COM oparty na bibliotece DLL powinien być wymieniony jako uruchomiony w ramach tego procesu. Po powrocie do skryptu ponowne uruchomienie programu tlist. exe informuje, że proces dllhost. exe nie jest już uruchomiony. Poniższa przykładowa próba wygenerowania obiektu ADODB. Obiekt Connection jest tworzony poza obszarem procesu programu SQL Server. Ta migawka przy użyciu programu tlist. exe została wykonana, gdy obiekt COM istniał w obszarze procesu dllhost. exe. Zwróć uwagę, że załadowano moduł Msado15. dll, który jest modułem zawierającym obiekt COM.  
      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
      W programie SQL Server w wersji 7,0 Desktop Edition działającym na stacjach roboczych systemu Microsoft Windows 95 lub Microsoft Windows 98, w trakcie wykonywania tej czynności można korzystać z programu "32-bitowe moduły" w narzędziu informacje o systemie Microsoft Aby uzyskać dostęp do narzędzia, kliknij przycisk Start, wskaż polecenie programy, wskaż polecenie akcesoria, a następnie kliknij polecenie Narzędzia systemowe.
Uwaga Z powodu ograniczeń zabezpieczeń system Windows 95 lub Windows 98 nie obsługuje uruchamiania procesów DLLSurrogate i ładowania biblioteki COM DLL przez klienta zdalnego. Dlatego obiekt COM musi znajdować się w obrębie uruchomionej tabeli obiektów (GNICIe) i być uruchomiony/załadowany, jeśli będzie dostępny do użytku przez zdalny komputer kliencki. Czynności opisane w tym artykule ułatwiają izolowanie obiektów COM, gdy istnieje podejrzenie, że jest to przyczyna niestabilności w programie SQL Server. Upewnij się, że wszystkie składniki są testowane całkowicie, aby zapewnić spójne zachowanie. Różnice w działaniu tworzenia wystąpienia obiektu COM w procesie programu SQL Server i poza obszarem procesu są różne. Ponadto niektóre obiekty COM nie były budowane jako zdalne i mogą przeciekać zasoby. Przed wykonaniem kroków przedstawionych w tym artykule należy dokładnie sprawdzić, czy nie jest to krok rozwiązywania problemów. W poniższym artykule z bazy wiedzy Microsoft Knowledge Base przykładem, w jaki sposób zdalne działanie obiektu COM może powodować przeciek zasobów:
197426 Poprawka: dojść do przecieku podczas przekazywania obiektów ADO między procesami 
Uwaga Program Microsoft SQL Server 6,5 domyślnie działa z modelem Single Thread Apartment (STA) i obsługuje inicjowanie obiektów COM na osobnym wątku wewnętrznym. W tym modelu jest zaznaczony pojedynczy wątek umożliwiający sterowanie tworzeniem wszystkich obiektów OLE w ramach procesu programu SQL Server i powrót do serwera proxy do wszystkich połączeń klientów wymagających dostępu do tego obiektu COM. Ponieważ jest to obsługiwane wewnętrznie przez program SQL Server, nie można zagwarantować trwałości obiektu między wystąpieniami obiektu COM. 

Informacje


Aby uzyskać więcej informacji na temat modelu obiektów COM programu SQL Server 6,5, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
194661 Model trwałości obiektu COM programu SQL Server
Aby uzyskać więcej informacji na temat sposobu implementacji procedury składowanej Sp_OA, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
180780 Jak zaimplementowano rozszerzenie procedur Sp_OA dla programu SQL Server
Aby uzyskać więcej informacji na temat uruchamiania obiektów COM opartych na bibliotece DLL w ramach surogatów biblioteki DLL; Zapoznaj się z następującymi uwagami: Eddon, Guy; Eddon Henry w modelu MPS (Distributed com). Microsoft Press, 1998, (ISBN 1-57231-849-X), rozdział 8: "desurogaty DLL i pliki wykonywalne Components'Box, Jan, podstawowy model com. Addison-Wesley pub. Co., (ISBN 0-201-63446-5) rozdział szósty: "Applications" Grimes, Richard, Professional DCOM Programming. Wrox Press Inc. (ISBN 1-861000-60-X), rozdział 4: "model obiektowy składnika rozproszonego" dodatek DCOM dla systemu Windows 95 jest dostarczany z nośnikiem programu SQL Server 7,0, a plik nosi nazwę DCOM95. exe. Program DCOM95. exe można pobrać z następującej witryny sieci Web: