Aracılığıyla paylaş


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

Bu makalede, SQL Server işleminin dışında DLL tabanlı bir COM nesnesinin nasıl çalıştırıldığı açıklanmaktadı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 olabilir.

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ı bir COM nesnesi çalıştırma işlemine uzaktan iletişim adı verilir. Uzaktan iletişim, SQL Server yürütülebilir dosyası yerine başka bir yürütülebilir dosyanın 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.exe olarak adlandırılır. DCOM destek yapısı, DLL'yi işlem alanına yüklemek için dllhost.exe dosyasını kullanır ve ardından istenen arabirimi istemciye saydam bir şekilde yeniden sıralamak için ara sunucu/saplama çiftlerini kullanır. Bu durumda SQL Server'dır. Bu yürütülebilir dosya aynı anda birden çok arabirim/yöntem isteğini 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 tüm DLL tabanlı COM nesnesine (örneğin, aracılığıyla mı yoksa genişletilmiş bir saklı yordamla sp_OACreate mı) uygulanabilir.

Daha Fazla Bilgi

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

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, nesnenin nerede oluşturulacağının bağlamını belirtmek için bu yordamın isteğe bağlı bir üçüncü parametresi vardır. Bu parametre belirtilmezse, varsayılan olarak 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ı belirten dört (4) olarak değiştirmeniz gerekir. Saklı yordamı kullanarak COM nesnesini işlem dışı çalıştırması için DCOM'u açıkça bilgilendirmek için aşağıdaki örneğe benzer söz dizimini sp_OACreate kullanın:

    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 üçüncü parametresi CoCreateInstance CoCreateInstanceEx olarak CLSCTX_LOCAL_SERVERdeğiştirilebilir. Bu, kullanılarak CoCreateInstanceaşağıdaki kod örneğinde gösterilir:

    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 OLEComponent.Object Tüm Nesneler altında biçiminde bulun. COM nesnesini seçin ve nesne menüsünden Bayraklar'ı seçinCoCreateInstance. Yalnızca CLSCTX_LOCAL_SERVER seçili olduğundan emin olun. Ardından, Uygulama ve Sağlama Sunucusu sekmeleri altında Vekil İşlemi Kullan'ı seçin ve dllhost.exe dosyasının yüklenmesine ve COM DLL'sinin işlem alanına getirilmesine olanak tanıyan Özel VekilIn 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 biçime sahiptir:

      OLEComponent.Object
      
    2. BIR COM nesnesinin sınıf tanımlayıcısını bulmak için programlı tanımlayıcıyı kullanabilirsiniz.

      Kayıt Defteri Düzenleyicisi'ni (regedit.exe) açın ve anahtarın HKEY_CLASSES_ROOT altında OLEComponent.Object> adlı <bir 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ı 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üzenleyicisi'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 örneğe yöneliktir ve sürüm oluşturma bilgileri için kullanılır.

    4. GUID'nin InprocServer32 alt anahtarı altında bir ThreadingModel değerin bulunduğundan ve SQL Server işlem alanında COM yürütülmesini etkinleştirmek için hazırlamanın COM nesnesinin iş parçacığı modelini anladığınızdan emin olmak için değerin Her İkisi 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üzenle menü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ımda 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, DLL'yi yürütülebilir dosyayla ilişkilendirmek için DCOM tarafından kullanılır.

    7. altına HKEY_CLASSES_ROOT\AppID yeni bir alt anahtar ekleyin ve adını önceki adımda eklendiği gibi 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üzenle menü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ı çalıştırması dllhost.exe ve COM nesnesini kendi işlem alanı içinde yüklemesini bildirir.

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

      Enter tuşuna basarak Dağıtılmış COM Yapılandırma Özellikleri iletişim kutusunu açı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'ın 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ış girdiyse, 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. Bunun dllhost.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. Bunun için Windows NT Resource Kit'in SQL Server'ın çalıştığı Windows NT bilgisayarında olması gerekir. 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'ye 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 yeniden çalıştırıldıktan sonra 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 nesnesi dllhost.exe işlem alanında mevcutken tlist.exe kullanan bu anlık görüntü gerçekleştirildi. COM nesnesini içeren modül olan modülün msado15.dll 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)