文章編號: 198891 - 上次校閱: 2007年2月22日 - 版次: 9.3

如何執行 SQL Server 處理序之外的 DLL COM 物件

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

結論

Microsoft SQL Server 6.5 版或更新版本提供能夠載入和執行自訂的元件物件模型 (COM) 物件透過一組 OLE 自動化的預存程序,或透過延伸預存程序。預設情況下,DLL COM 物件是在這表示 COM 物件就不會只載入在 SQL Server 處理序記憶體位址空間,內,但是它們也有完整存取權限到此記憶體位址空間的處理序伺服器中載入。因此,載入 SQL Server 處理序空間中的 COM 物件必須遵守與任何的 DLL 檔案相同的規則。沒有 COM 物件可能會覆寫記憶體中 SQL Server 處理序或遺漏資源,導致不穩定的可能性。

如果 COM 物件可能會影響 SQL Server 處理序的強固性 suspicion 可能要使用本文中的步驟來具現化 COM 物件,SQL Server 處理序空間之外。實作的 「 分散式元件物件模型的 」 (DCOM) 規格 」 位置透明度 」 到作業系統已提供能夠執行 SQL Server 處理序空間之外的 DLL COM 物件。

執行位址空間的主要應用程式以外的 DLL 為基礎的 COM 物件的處理程序就稱為遠端處理。遠端處理要求另一個可執行檔必須代理處理程序,SQL Server 可執行檔的位置。使用由 DCOM 服務控制管理員 (Rpcss.exe) 預設值可執行檔會命名為 Dllhost.exe。DCOM 支援結構會使用 Dllhost.exe 檔案來將其處理序空間載入 DLL,然後再使用 Proxy/虛設常式組封要求的介面無障礙地送回給用戶端在這種情況下是 SQL Server。這個可執行檔可以同時接受多個介面/方法要求。介面使用完成後,DCOM 服務控制管理員 (SCM) 管理以初始狀態最新和卸載 Dllhost.exe 檔案。COM 物件應該不預期要保留在之間執行個體化的狀態資訊。

這篇文章能夠正確地運作,系統必須執行為 DCOM 啟用的作業系統。這是 Microsoft Windows NT 4.0 Service Pack 2 或更新版本,Microsoft Windows 98 或 Microsoft Windows 95 使用 [DCOM 增益安裝。下列步驟可以適用於正在建立 SQL Server 處理序空間中的任何 DLL COM 物件中,是否已被透過 sp_OACreate 或延伸預存程序執行個體化。

其他相關資訊

您可以使用來產生 COM 物件處理程序中的兩個基本方法的相關資訊如下。

COM 用戶端要求遠端處理的物件

藉由變更叫用 COM 物件的方式,您可以要求所建立的物件,SQL Server 位址空間之外。
  • 如果使用 sp_OACreate 程序載入 COM 物件,依預設它會載入程序中。但是,沒有選擇性的第三個參數給這個程序該可能可以使用來指示建立物件的位置的內容。如果沒有指定這個參數就預設值的五 (5) 用這表示執行內部或外部程序的物件。您需要變更參數以四 (4),表示此元件是以本機的可執行檔執行的 DCOM。請使用類似於下列範例以明確地通知 DCOM 以執行 「 超出程序 」 的 COM 物件的語法使用 sp_OACreate 預存程序:
       DECLARE @object int
       DECLARE @hr int
       EXEC @hr = sp_OACreate 'SQLOLE.SQLServer', @object OUT, 4
    						
  • 如果內建立 COM 物件的延伸預存程序的 CoCreateInstance 第三個參數,或者 CoCreateInstanceEx 可以變更要 CLSCTX_LOCAL_SERVER。這使用 CoCreateInstance 下列的程式碼範例所示:
       HRESULT hr = CoCreateInstance(CLSID_Test, NULL, CLSCTX_LOCAL_SERVER,
         IID_IUnknown, (void**)&piunknown);
    						

修改登錄,以強制遠端處理的物件

如果您不能修改要求所建立的物件,處理程序中的 COM 用戶端,兩個不同的方法存在強制要建立處理程序中的物件。
  • 使用 OLE/COM 物件檢視器 (Oleview.exe),Microsoft Visual C++ 會隨附並在形式的 全部物件] 下的 OLEComponent.Object 中找出該程式識別碼。選取 [COM] 物件,然後從 [物件] 功能表選取 [CoCreateInstance 旗標。確定已選取 [僅 CLSCTX_LOCAL_SERVER。接下來,在 實作Inproc 伺服器 定位點選取 使用 Surrogate 處理 並將"路徑以自訂 Surrogate"留空白,讓要載入 Dllhost.exe 檔案然後 COM DLL 帶到它的處理序空間。

    如果您沒有 Microsoft Visual C++ OLE/COM 物件檢視器公用程式已經也可供下載從下列 Microsoft 網站:
    http://www.microsoft.com/downloads/details.aspx?familyid=5233b70d-d9b2-4cb5-aeb6-45664be858b6&displaylang=en (http://www.microsoft.com/downloads/details.aspx?familyid=5233b70d-d9b2-4cb5-aeb6-45664be858b6&displaylang=en)
  • 使用下列步驟來手動更新登錄。

    警告如果您修改登錄不當使用 「 登錄編輯程式 」,或使用另一個方法,可能會發生嚴重的問題。這些問題可能會要求您重新安裝作業系統。Microsoft 無法保證可以解決這些問題。您必須自己承擔修改登錄所造成的風險。
    1. 取得類別識別項 (CLSID) 的 COM 物件。CLSID 是一個 128 位元的數字,考量一個全域唯一識別項 (GUID),用來唯一地識別元件、 模組或檔案,其中包含這個 COM 物件。當建立 COM 物件使用 OLE 自動化預存程序時,第一個參數至預存程序是程式設計識別項或 OLE 物件的程式識別碼用來衍生 CLSID。這個字元字串描述 OLE 物件的類別,並具有下列形式:
            OLEComponent.Object
      								
      您可以利用程式設計識別項來尋找 COM 物件類別識別項。

      開啟 [登錄編輯程式 (Regedit.exe) 並 HKEY_CLASSES_ROOT 機碼下使用 Find 方法找出具有您 <OLEComponent.Object> 名稱的機碼的位置. 您會發現它在其他層級,但它應該是位於 [HKEY_CLASSES_ROOT 的正下方層級。找出機碼之後展開索引鍵名稱的資料夾,您應該看到名為 CLSID 的子機碼。按一下該資料夾以查看內該機碼值。螢幕右邊被命名標題為 [(預設)]。該索引鍵的資料應該以下列形式:
            {59F929A0-74D8-11D2-8CBC-08005A390B09}
      								
      請記下這個值,或是將它複製到 「 記事本 」。包含在括號。
    2. HKEY_CLASSES_ROOT\CLSID 機碼下瀏覽並找到子機碼具有這個 GUID 號碼。您反白顯示 HKEY_CLASSES_ROOT\CLSID 機碼之後您可以使用 尋找 函式的設定,在 [登錄編輯程式] (在 [編輯] 功能表中),並將 GUID 貼至 [尋找] 對話方塊。請確定您已經透過檢查 InprocServer32 子機碼下面這個機碼指向 COM DLL 檔案的位置找到適當的介面。如果有一個 TypeLib 金鑰請檢查這個 GUID 值。這應該是不同於您在步驟 1 中記下。否則,您必須 TypeLib GUID 並不為 COM 物件 GUID。ProgID 子機碼將會有 'OLEComponent.Object.1' 的值。將上的一個是用於這個範例只,用於版本控制資訊。
    3. 在 [GUID 的 InprocServer32 子機碼,請確定 ThreadingModel 值存在,而且它是將設為其中一個雙向或無請確定封送處理瞭解 COM 物件,才能啟用的 COM 執行 SQL Server 處理序空間用完執行緒模式。如果不 ThreadingModel 值,或被設定為 [公寓,COM 物件執行個體化可能不一致。

      附註如果您新增的 ThreadingModel 值,請確定您在實作之前測試您的 COM 物件。
    4. 反白顯示子機 GUID 號碼/碼 HKEY_CLASSES_ROOT\CLSID 機碼下。從 [編輯] 功能表按一下 [新增],然後選取 [字串值。在 [名稱] 欄位下輸入下列命令:
      AppID
    5. 按下 ENTER 鍵,然後插入從步驟 1 做為值的 [類別識別項或 GUID 您記下的數字。GUID 應該位於下列範例中大括號內:
       
            {59F929A0-74D8-11D2-8CBC-08005A390B09} 
      
      								
      AppID 的應用程式識別項由 DCOM 用來關聯可執行檔的 DLL。
    6. 新增新的子機碼下 [HKEY_CLASSES_ROOT\AppID 並將它的名稱設定為相同的類別識別項或加上方括弧,如同在先前步驟中插入的 GUID 號碼。
    7. 反白顯示 GUID 名稱。從 [編輯] 功能表按一下 [新增],然後選取 [字串值。在 [名稱] 欄位下輸入下列命令:
      DllSurrogate
      將 [資料] 資料行保留為空白此值。由於資料行是空白,這樣會通知 DCOM 執行預設的可執行檔,Dllhost.exe 和載入 COM 物件在它的內處理空間。
    8. 關閉 [登錄編輯程式]。按一下 [開始],然後按一下 [執行]。在 [執行] 對話方塊鍵入下列內容:
      DCOMCNFG
      按下 ENTER 鍵以開啟 [分散式 COM 設定內容] 對話方塊。按一下 [預設內容] 索引標籤並確定已選取 [在這台電腦上啟用 DCOM。如果不是,選取它,然後按一下 [套用]
    9. 請確定 Microsoft Windows NT 使用者帳戶下執行 SQL Server 具有登錄機碼,此物件的完全控制 」 權限。如果權限都不是足夠或登錄機碼不正確地輸入您正在建立 COM 物件時,可能就會發生下列錯誤:
      OLE 自動化資訊時發生錯誤
      HRESULT: 0x80040154
      擴充程序的來源: ODSOLE
      描述: 類別未登錄

      OLE 自動化資訊時發生錯誤
      HRESULT: 0x80070005
      擴充程序的來源: ODSOLE
      描述: 存取被拒。

      OLE 自動化資訊時發生錯誤
      HRESULT: 0x80080005
      擴充程序的來源: ODSOLE
      描述: 伺服器執行失敗
    10. 測試,看看是否這是執行 Dllhost.exe 檔案,並且載入 COM 物件,其處理程序空間中。這需要 Microsoft Windows NT 資源工具箱 」 是在 SQL Server 執行 Windows NT 電腦上。開啟命令提示字元,並從命令提示字元執行 Tlist.exe 檔案會顯示所有處理程序和其相關的處理序識別項或處理序識別碼 (PID)。在 Transact-SQL 指令碼在執行 sp_OACreate 的地方,並在執行該呼叫之後但指令碼] 結束之前的使用下列項目來延遲指令碼完成的額外 20 秒:
      WAITFOR DELAY '000:00:20'
      								
      執行指令碼並立即瀏覽至 [命令提示字元,且執行 Tlist.exe 檔案。請注意 Dllhost.exe PID。重新執行 Tlist.exe,並將 [PID 當做參數傳遞。這會顯示 Dllhost.exe 程序空間中載入的 DLL。DLL COM 物件應該會列出為此處理序中執行。指令碼傳回之後,再次執行 Tlist.exe 揭露 Dllhost.exe 程序已不再執行。

      下列的範例輸出中會建立 ADODB.Connection 物件的 SQL Server 處理序空間之外。COM 物件存在於 Dllhost.exe 處理序空間中時,已執行使用 Tlist.exe 這個快照集。 請注意載入模組是包含 COM 物件的模組的 Msado15.dll。
      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
      								
      與 SQL Server 7.0 桌面版 Microsoft Windows 95 或 Microsoft Windows 98 工作站上執行,"32 位元模組載入 「 Microsoft 系統資訊的應用程式工具內可以用來查看 loading\unloading Dllhost.exe 檔案和 COM 物件在這個測試期間的 DLL 的執行期間版。存取工具]、 按一下 [開始]、 指向 [程式集]、 指向 [附屬應用程式,及然後按一下 [系統工具]]。
附註因為安全性限制的 Windows 95 或 Windows 98 不支援啟動 DLLSurrogate 處理程序和載入由遠端用戶端的 COM DLL。因此,COM 物件必須存在內執行物件表格 (ROT),而且會執行/載入如果是可供使用的遠端用戶端電腦。 您可以使用本文中的步驟,以協助隔離的 COM 物件,當它們會懷疑是 SQL Server 中的不穩定的原因。請確定每個元件會測試徹底執行完程序來確保一致的行為。在 SQL Server 處理序中和外部處理序空間的 COM 物件具現化的效能差異而有所不同。而且,某些 COM 物件已不內建是遠端處理,接著可以遺漏資源。本文中實作該步驟的疑難排解步驟以外的其他項目之前徹底測試。 下列 「 Microsoft 知識庫 」 文件,有一個的方式遠端處理 COM 物件可能會造成資源流失範例:
197426? (http://support.microsoft.com/kb/197426/ ) FIX: 控制代碼遺漏時處理序之間傳遞 ADO 物件
附註Microsoft SQL Server 6.5,預設情況下,使用單一執行緒公寓 (STA) 模型的運作方式,以及處理個別的內部執行緒上的 COM 物件初始化。這個模型中一個執行緒會選取控制所有 OLE 物件的 SQL Server 處理序中,並回到需要存取此 COM 物件的所有用戶端連線的 Proxy 建立。因為這由 SQL Server 內部進行處理,無法保證物件的持續性之間的 COM 物件的執行個體化。

?考

如需有關 SQL Server 6.5 COM 物件模型的資訊,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
194661? (http://support.microsoft.com/kb/194661/ ) SQL Server COM 物件持續性模型
方式的相關資訊之 Sp_OA 預存程序實作時,請按一下下列文章編號,檢視 「 Microsoft 知識庫 」 中的發行項件:
180780? (http://support.microsoft.com/kb/180780/ ) Sp_OA 程序延伸到 SQL Server 的實作方式
如需執行 DLL 代理; 內的 DLL COM 物件的詳細資訊請參閱下列:

Eddon,Scripting Guy ; Eddon 亨利 內部分散式 COM (mps)Microsoft 按,1998,ISBN 1-57231-849-X,第八: ' DLL 代理和可執行檔的元件

方塊,Don,基本 COM。Addison Wesley 不。Co.、 (ISBN 0-201-63446-5) 第 6 章: '應用程式' Grimes、 羅、 專業 DCOM 發展。Wrox 按 Inc.(ISBN 1-861000-60-X)、 第四種: '分散式元件物件模型' [DCOM 增益功能的 Windows 95 運送與 SQL Server 7.0 媒體,該檔案為 Dcom95.exe。您可以從下列網站下載 Dcom95.exe:
http://www.microsoft.com/com (http://www.microsoft.com/com)

這篇文章中的資訊適用於:
  • Microsoft SQL Server 6.5 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Workgroup Edition
關鍵字:?
kbmt kbinfo KB198891 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:198891? (http://support.microsoft.com/kb/198891/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。