INPROC 範例:示範同處理序 Automation 伺服應用程式

更新:2007 年 11 月

INPROC 範例是一個同處理序 (In-Process) Automation (先前稱為 OLE Automation) 伺服程式。和其他 MFC Automation 伺服程式範例不同,INPROC 可以載入為用戶端位址空間中的動態連結程式庫 (DLL)。同處理序伺服程式 (In-Process Server) 通常比將伺服程式當成個別 EXE 來實作還要有效率,因為遠端程序呼叫 (RPC) 並不需要在由伺服程式所實作的物件上叫用方法。

注意事項:

部分範例 (包括本範例) 尚未經過改寫,無法反映出目前在 Visual C++ 精靈、程式庫以及編譯器方面的變更,不過還是可以示範如何完成您要進行的工作。

安全性注意事項:

這個程式碼範例僅供概念說明之用,同時因為範例中的程式碼撰寫並沒有周全的顧及所有安全性問題,所以本範例不適用於實際執行的應用程式或網站中。如果使用者擅自將範例程式碼用於其他意圖而導致連帶事件或重大損害時,Microsoft 將不承擔任何責任。

若要取得範例和指示以便進行安裝:

  • 按一下 Visual Studio [說明] 功能表上的 [範例]。

    如需詳細資訊,請參閱尋找範例檔案

  • 最新版的完整範例清單可從 Visual Studio 2008 範例網頁 (英文) 取得。

  • 您也可以將範例置於電腦硬碟中。根據預設,範例和讀我檔案都會複製到 \Program Files\Visual Studio 9.0\Samples\ 下的資料夾中。對於所有的 Visual Studio Express 版,所有範例都可在線上找到。

建置和執行範例

若要建置並執行 INPROC 範例

  1. 開啟 inproc.sln 方案。

  2. 在 [建置] 功能表上,按一下 [建置]。

  3. 使用專案的 .reg 檔 (也就是執行 regedit INPROC.REG 或從 REGSVR 範例使用 REGSVR) 以登錄 INPROC 的 DLL。

    如果您使用 REGEDIT,請確認 Inproc.dll 是位於系統路徑中。此外,您可以修改 .reg 檔案來明確地參考至 Inproc.dll 的路徑。

    DLL 無法像 EXE 一樣獨立執行,因此,如果要測試 INPROC,您必須從用戶端應用程式來「驅動」它。INPROC 可以從 Visual Basic 或 Visual C++ 來驅動。如需從 Visual C++ 驅動 INPROC 的範例,請參閱 IPDRIVE 範例。

    注意事項:

    您可以建置 EXE 版本或 DLL 版本的 INPROC。在範例的專案設定中設定 EXE Variant。一個 EXE 版本的 INPROC 只會將本身登錄在 Windows 登錄中。

INPROC 類別

CVariantMap 類別會將 VARIANT 實作至 VARIANT 對應中。這樣就可以將任何一個 VARIANT 對應到任何其他的 VARIANT。雖然這點對 Visual C++ 程式設計人員 (即可能會直接使用 CMap 的人) 可能沒有益處,但這個功能的確可以為 Visual Basic 使用者提供 MFC 集合類別的強大功能。您可以使用 mfc.inproc.varmap 名稱來存取 CVariantMap 類別。這是 Windows 登錄用來登錄物件的方式。CVariantMap 會實作標準的集合方法、屬性,以及 _NewEnum 方法。

CStringCollect 類別會實作一個字串陣列。它的實作比 CVariantMap 類別簡單,即使它可以實作許多和 CVariantMap 相同的 Automation 功能。您可以使用 mfc.inproc.strcoll 名稱來存取 CStringCollect 物件。它會實作大部分的標準集合方法和屬性,而且是實作您自己集合的一個好範例。更重要的是,它會實作 _NewEnum 方法,這會讓 Visual Basic 使用者在列舉集合內容時使用 For Each... In 語法。CStringCollect 會使用 CEnumVariant 來實作這個功能 (它會使用 MFC 的介面對應來實作 IEnumVARIANT)。您會發現 CEnumVariant 在您的應用程式中是非常有用的。

最後,範例會實作一些虛設屬性,它們只是用來比較同處理序伺服程式與 LocalServer 伺服程式的效能差異。這些都是由 IPDRIVE Test1 和 Test2 按鈕測試完成的屬性。

關鍵字

本範例會使用下列關鍵字:

AfxIsValidAddress; AfxMessageBox; AfxOleInit; AfxOleLockApp; AfxOleUnlockApp; AfxThrowMemoryException; AfxThrowOleException; CCmdTarget::EnableAutomation; CCmdTarget::GetIDispatch; CCmdTarget::OnFinalRelease; CString::AllocSysString; CWinApp::InitInstance; CWinApp::RunAutomated; CWinApp::RunEmbedded; DllCanUnloadNow; DllGetClassObject; min

請參閱

其他資源

MFC 範例