SQL Server işleminin dışında DLL tabanlı bir COM nesnesi çalıştırma

Bu makalede, SQL Server işleminin dışında DLL tabanlı com nesnesinin nasıl çalıştırıldığı açıklanır.

Özgün ürün sürümü: SQL Server
Özgün KB numarası: 198891

Özet

Microsoft SQL Server, bir dizi OLE Otomasyonu saklı yordamı veya genişletilmiş saklı yordamlar aracılığıyla özel Bileşen Nesne Modeli (COM) nesnelerini yükleme ve çalıştırma özelliği sağlar. Varsayılan olarak, DLL tabanlı COM nesneleri işlem sunucusunda olduğu gibi yüklenir; başka bir deyişle COM nesneleri yalnızca SQL Server işlem bellek adres alanına yüklenmez, aynı zamanda bu bellek adres alanına da tam erişime sahiptir. Bu nedenle, SQL Server işlem alanına yüklenen bir COM nesnesi, herhangi bir DLL dosyasıyla aynı kurallara uymalıdır. BIR COM nesnesinin SQL Server işlemi içindeki belleğin üzerine yazabileceği veya kaynakları sızdırabileceği ve bu da dengesizliklere neden olabileceği bir olasıdır.

BIR COM nesnesinin SQL Server işleminin sağlamlığını etkilediği şüphesi varsa, SQL Server işlem alanının dışında COM nesnesinin örneğini oluşturmak için bu makaledeki adımları kullanmak isteyebilirsiniz. Dağıtılmış Bileşen Nesne Modeli'nin (DCOM) Konum Saydamlığı belirtiminin işletim sistemine uygulanması, SQL Server işlem alanının dışında DLL tabanlı bir COM nesnesi çalıştırma olanağı sağlamıştır.

Ana uygulamanın adres alanının dışında DLL tabanlı com nesnesi çalıştırma işlemine uzaktan iletişim adı verilir. Uzaktan iletişim, başka bir yürütülebilir dosyanın SQL Server yürütülebilir dosyanın yerine bir vekil işlem olmasını gerektirir. DCOM Hizmet Denetim Yöneticisi (rpcss.exe) tarafından kullanılan varsayılan yürütülebilir dosya dllhost.exeolarak adlandırılır. DCOM destek yapısı , DLL'yi işlem alanına yüklemek içindllhost.exedosyasını kullanır ve ardından istenen arabirimi istemciye saydam bir şekilde yeniden sıralamak için ara sunucu/saptama çiftlerini kullanır ve bu durumda SQL Server. Bu yürütülebilir dosya birden çok arabirim/yöntem isteğini eşzamanlı olarak kabul edebilir. Arabirim kullanımı tamamlandıktan sonra DCOM Hizmet Denetim Yöneticisi (SCM), dllhost.exe dosyasının temizlenmesini ve kaldırılmasını yönetir. COM nesnelerinin örnek oluşturmalar arasında durum bilgilerini tutması beklenmemelidir.

Aşağıdaki adımlar, SQL Server işlem alanında oluşturulan dll tabanlı herhangi bir COM nesnesine (örneğin, aracılığıyla veya genişletilmiş bir saklı yordam) sp_OACreate uygulanabilir.

Daha fazla bilgi

COM nesnesinin örneğini işlem dışında başlatmak için kullanabileceğiniz iki temel yöntem hakkında bilgi aşağıdadır.

COM istemcisi nesnenin uzaktan iletişimini istemektedir

COM nesnesini çağırma yönteminizi değiştirerek, nesnenin SQL Server adres alanının dışında oluşturulmasını isteyebilirsiniz.

  • COM nesnesi yordamı kullanılarak sp_OACreate yüklenirse, varsayılan olarak işlem sırasında yüklenir. Ancak, bu yordamda nesnenin oluşturulacağı bağlamı belirtmek için kullanabileceğiniz isteğe bağlı bir üçüncü parametre vardır. Bu parametre belirtilmezse, varsayılan beş (5) ayarı kullanılır; bu da nesneyi işlemin içinde veya dışında çalıştırmak anlamına gelir. Parametresini DCOM'a bu bileşenin yerel yürütülebilir dosya olarak çalıştırıldığını gösteren dört (4) olarak değiştirmeniz gerekir. Aşağıdaki örneğe benzer söz dizimini kullanarak DCOM'u saklı yordamı kullanarak COM nesnesini işlem dışında çalıştırması konusunda açıkça bilgilendirin sp_OACreate :

    DECLARE @object int
    DECLARE @hr int
    EXEC @hr = sp_OACreate 'SQLOLE.SQLServer', @object OUT, 4
    
  • COM nesnesi genişletilmiş bir saklı yordam içinde oluşturulduysa veya CoCreateInstanceEx öğesinin CoCreateInstance üçüncü parametresi olarak CLSCTX_LOCAL_SERVERdeğiştirilebilir. Bu, aşağıdaki kod örneğinde kullanılarak CoCreateInstancegösterilmiştir:

    HRESULT hr = CoCreateInstance(CLSID_Test, NULL, CLSCTX_LOCAL_SERVER,
    IID_IUnknown, (void**)&piunknown);
    

Nesnenin uzaktan iletişimini zorlamak için kayıt defterini değiştirme

COM istemcisini nesnenin işlem dışında oluşturulmasını istemek üzere değiştiremiyorsanız, nesnenin işlem dışı oluşturulmasını zorlamak için iki farklı yöntem vardır.

  • Visual C++ ile birlikte gelen OLE/COM Nesne görüntüleyicisini (oleview.exe) kullanın ve ProgID'yi Tüm Nesneler altında biçiminde OLEComponent.Object bulun. COM nesnesini seçin ve nesne menüsünden Bayraklar'ı seçin CoCreateInstance . Yalnızca CLSCTX_LOCAL_SERVER seçili olduğundan emin olun. Ardından, Uygulama ve Sağlama Sunucusu sekmeleri altında Vekil İşlemiKullan'ı seçin ve dllhost.exe dosyasının yüklenmesine ve COM DLL'sinin işlem alanına getirilmesine olanak tanıyan Özel Vekil Yolu'nu boş bırakın.

  • Kayıt defterini el ile güncelleştirmek için aşağıdaki adımları kullanın.

    Uyarı

    Kayıt Defteri Düzenleyicisi'ni veya başka bir yöntemi kullanarak kayıt defterini hatalı olarak değiştirirseniz önemli sorunlar oluşabilir. Bu sorunlar, işletim sisteminizi yeniden yüklemenizi gerektirebilir. Microsoft, bu sorunların çözülebileceği konusunda garanti veremez. Kayıt defterini değiştirmek kendi sorumluluğunuzdadır.

    1. COM nesnesinin Sınıf Tanımlayıcısını (CLSID) alın. CLSID 128 bitlik bir sayıdır ve bu COM nesnesini içeren bileşeni, modülü veya dosyayı benzersiz olarak tanımlamak için kullanılan Genel Benzersiz Tanımlayıcı (GUID) olarak kabul edilir. OLE Otomasyonu saklı yordamlarını kullanarak COM nesneleri oluştururken, saklı yordamın ilk parametresi programlı bir tanımlayıcıdır veya CLSID'yi türetmek için OLE nesnesinin ProgID değeri kullanılır. Bu karakter dizesi OLE nesnesinin sınıfını açıklar ve aşağıdaki forma sahiptir:

      OLEComponent.Object
      
    2. Programlı tanımlayıcıyı kullanarak BIR COM nesnesinin sınıf tanımlayıcısını bulabilirsiniz.

      Kayıt Defteri Düzenleyici (regedit.exe) açın ve anahtarın HKEY_CLASSES_ROOT altında OLEComponent.Object> adlı <anahtarı bulmak için yöntemini kullanınFind. Diğer düzeylerde bulacaksınız, ancak doğrudan altında HKEY_CLASSES_ROOTdüzeyinde bulunmalıdır. Anahtarı buldukktan sonra anahtar adının klasörünü genişletdiğinizde CLSID adlı bir alt anahtar görmeniz gerekir. Bu anahtarın içindeki değerleri görmek için bu klasörü seçin. Ekranın sağ tarafında Varsayılan adlı bir başlık bulunur. Bu anahtarın verileri aşağıdaki biçimde olmalıdır:

      {59F929A0-74D8-11D2-8CBC-08005A390B09}

      Bu değeri not edin veya Not Defteri'ne kopyalayın. Köşeli ayraçları ekleyin.

    3. Anahtarın HKEY_CLASSES_ROOT\CLSID altına gidin ve bu GUID numarasına sahip alt anahtarı bulun. Anahtarı vurguladıktan HKEY_CLASSES_ROOT\CLSID sonra Kayıt Defteri Düzenleyici'nde Bul işlevini kullanabilir (Düzenle menüsünün altında) VE GUID'yi Bul iletişim kutusuna yapıştırabilirsiniz. Com DLL dosyanızın konumunu gösteren bu anahtarın altındaki InprocServer32 alt anahtarını inceleyerek uygun arabirimi bulduğunuzdan emin olun. TypeLib anahtarı varsa bu GUID değerini denetleyin. Bu, 1. adımda not ettiğinizden farklı olmalıdır. Aksi takdirde, COM nesnesinin GUID'sine değil TypeLib GUID'sine sahipsinizdir. ProgID alt anahtarının OLEComponent.Object.1değeri olacaktır. Uçta olan yalnızca bu örnek içindir ve sürüm oluşturma bilgileri için kullanılır.

    4. GUID'nin InprocServer32 alt anahtarının altında bir ThreadingModel değer bulunduğundan ve com nesnesinin SQL Server işlem alanı dışında yürütülmesini etkinleştirmek için hazırlamanın COM nesnesinin iş parçacığı modelini anlamasını sağlamak için her ikisi veya Ücretsiz olarak ayarlandığından emin olun. Değer ThreadingModel yoksa veya Apartment olarak ayarlandıysa, COM nesne örneği tutarlı olmayabilir.

      Not

      Değeri eklerseniz ThreadingModel , uygulamadan önce COM nesnenizi test ettiğinizden emin olun.

    5. Anahtarın altındaki GUID numarasını/alt anahtarını vurgulayın HKEY_CLASSES_ROOT\CLSID . Düzenlemenüsünden Yeni'yi ve ardından Dize Değeri'ni seçin. Ad sütununun altına AppID yazın.

    6. ENTER tuşuna basın ve ardından 1. adımdan not ettiğiniz sınıf tanımlayıcısını veya GUID numarasını değer olarak ekleyin. GUID, aşağıdaki örnekte olduğu gibi küme ayraçlarının içinde olmalıdır:

      {59F929A0-74D8-11D2-8CBC-08005A390B09}
      

      Uygulama tanımlayıcısı AppID, DCOM tarafından DLL'yi yürütülebilir bir dosyayla ilişkilendirmek için kullanılır.

    7. altına HKEY_CLASSES_ROOT\AppID yeni bir alt anahtar ekleyin ve adını, önceki adımda eklenen köşeli ayraçlarla aynı sınıf tanımlayıcısına veya GUID numarasına ayarlayın.

    8. GUID adını vurgulayın. Düzenlemenüsünden Yeni'yi ve ardından Dize Değeri'ni seçin. Ad sütununun altına dllSurrogate yazın.

      Bu değer için Veri sütununu boş bırakın. Veri sütunu boş olduğundan bu, DCOM'a varsayılan yürütülebilir dosyayı (dllhost.exe) çalıştırması ve COM nesnesini işlem alanı içinde yüklemesini bildirir.

    9. Kayıt Defteri Düzenleyici kapatın. Başlat'a tıklayın ve çalıştır'ı seçin. Çalıştır iletişim kutusuna DCOMCNFG yazın.

      Dağıtılmış COM Yapılandırma Özellikleri iletişim kutusunu açmak için ENTER tuşuna basın. Varsayılan Özellikler sekmesine tıklayın ve Bu bilgisayarda Dağıtılmış COM'ı Etkinleştir'in seçili olduğundan emin olun. Değilse, seçin ve ardından Uygula'yı seçin.

    10. SQL Server altında çalıştığı Windows NT kullanıcı hesabının bu nesnenin kayıt defteri anahtarları üzerinde Tam Denetim iznine sahip olduğundan emin olun. İzinler yeterli değilse veya kayıt defteri anahtarları yanlış giriş yaparsa, COM nesnesini oluştururken aşağıdaki hatalar oluşabilir:

      OLE Otomasyonu Hata Bilgileri
      HRESULT: 0x80040154
      Kaynak: ODSOLE Genişletilmiş Yordamı
      Açıklama: Sınıf kaydedilmedi

      OLE Otomasyonu Hata Bilgileri
      HResult: 0x80070005
      Kaynak: ODSOLE Genişletilmiş Yordamı
      Açıklama: Erişim reddedildi.

      OLE Otomasyonu Hata Bilgileri
      HRESULT: 0x80080005
      Kaynak: ODSOLE Genişletilmiş Yordamı
      Açıklama: Sunucu yürütme başarısız oldu

    11. Bunundllhost.exe dosyasını çalıştırıp çalıştırmadığını ve COM nesnesini işlem alanına yükleyip yüklemediğini test edin ve görün. Bu, Windows NT Kaynak Seti'nin SQL Server çalıştığı Windows NT bilgisayarda olmasını gerektirir. Bir komut istemi açın ve komut isteminden tüm işlemleri ve ilişkili işlem tanımlayıcılarını veya İşlem Tanımlayıcılarını (PID) gösteren tlist.exe dosyasını çalıştırın. Transact-SQL betiğinde çalıştırılan sp_OACreate ve bu çağrı yürütüldükten sonra ancak betik bitmeden önce betiğin tamamlanmasını 20 saniye daha geciktirmek için aşağıdakileri kullanın:

      WAITFOR DELAY '000:00:20'
      

      Betiği çalıştırın ve hemen komut istemine gidin ve tlist.exe dosyasını çalıştırın. dllhost.exe PID'sine dikkat edin. tlist.exe yeniden çalıştırın ve PID'yi parametre olarak geçirin. Bu, dllhost.exe işlem alanı içinde yüklenen DLL'leri gösterir. DLL tabanlı COM nesnesi, bu işlem içinde çalışıyor olarak listelenmelidir. Betik döndükten sonra ,tlist.exe çalıştırılırken dllhost.exe işleminin artık çalışmadığını gösterir.

      Aşağıdaki örnek çıktıda ADODB. Bağlantı nesnesi, SQL Server işlem alanının dışında oluşturulur. com nesnesidllhost.exe işlem alanında mevcutken tlist.exekullanan bu anlık görüntü gerçekleştirildi. COM nesnesini içeren modül olan msado15.dllmodülünün yüklendiğine dikkat edin.

      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
      

Başvurular

OLE Otomasyonu Saklı Yordamları (Transact-SQL)