ATLDuck 屬性範例:使用具 ATL 的連接點
更新:2007 年 11 月
ATLDuck 屬性範例內有兩個專案:atlduck 和 duck。duck 專案會建立能夠實作 IDuckInt 介面的物件執行個體。這個介面包含了四個成員函式:Flap、Paddle、Quack 和 Walk。
第二個專案 atlduck 具有 IDuckInt 介面的連接點 (也就是說,本專案知道如何使用介面,但並不會實作該介面),只會建立一個這個物件的執行個體。一旦在兩個應用程式之間建立連接之後,atlduck 將會為已經呼叫 IConnectionPoint::Advise 的接收 (Sink),呼叫 IDuckInt 介面中的函式。
各種 IDL、COM 和編譯器屬性都會在 ATLDuck 中示範,包括 aggregatable、event_source 和 event_receiver。DuckInt 類別是藉由指定 aggregratable ("never") 屬性來變成非彙總。DuckDoer 類別會被設定為 com event_source,而 DuckInt 類別則會設定為 com event_receiver,不具有 layout dependent=true。
ATLDuck 範例是本範例的未使用屬性版本。
安全性注意事項: |
---|
這個程式碼範例僅供概念說明之用,同時因為範例中的程式碼撰寫並沒有周全的顧及所有安全性問題,所以本範例不適用於實際執行的應用程式或網站中。如果使用者擅自將範例程式碼用於其他意圖而導致連帶事件或重大損害時,Microsoft 將不承擔任何責任。 |
若要取得範例和指示以便進行安裝:
按一下 Visual Studio [說明] 功能表上的 [範例]。
如需詳細資訊,請參閱尋找範例檔案。
最新版的完整範例清單可從 Visual Studio 2008 範例網頁 (英文) 取得。
您也可以將範例置於電腦硬碟中。根據預設,範例和讀我檔案都會複製到 \Program Files\Visual Studio 9.0\Samples\ 下的資料夾中。對於 Visual Studio 的 Express 版,所有範例都可在線上找到。
建置和執行範例
若要建置這個範例
開啟 atlduck.sln 方案檔。
在 [建置] 功能表中,按一下 [建置方案]。此步驟將會建立專案並執行必要的登錄,同時也會建立以下的檔案:
atlduck.exe,EXE 伺服器
duck.exe,EXE 用戶端
若要執行這個範例
從 [偵錯]功能表中,按一下 [啟動但不偵錯]。這將會啟動 atlduck 伺服器以及 duck 用戶端的執行個體。若要執行一部以上的用戶端,請瀏覽至 duck.exe 所在的目錄,並從命令提示字元中手動執行 duck.exe。
對話方塊隨即出現。在對話方塊中,按一下 [Create DoDuck Object] 按鈕。當您按一下這個按鈕時,應用程式會建立具有 ID CLSID_DuckDoer 類別之物件的執行個體,並執行 atlduck。
由 atlduck.exe 發出的新對話方塊會出現。這個對話方塊會顯示 IDuckInt 介面中每個函式的按鈕,以及與使用中的接收 (Sink) 之間的連接和 Cookie 的清單方塊。從 duck 對話方塊中,您可以選擇通知或不通知 (Advise 或 Unadvise) 連接點。根據您的選擇,您可能會收到來自來源的通知。當您收到時,通知會顯示在狀態編輯欄位中。此外,當通知連接時,ATLDuck 會示範由連接點提供的 Cookie 值。
屬性
本範例使用下列屬性:
ATLDuck aggregatable, coclass, dispinterface, event_source, exe, helpstring, id, module, name, progid, uuid, vi_progid
ATLDuck/Duck aggregatable, coclass, default, dispinterface, event_receiver, exe, helpstring, id, iid_is, in, module, name, object, out, progid, unique, uuid, version, vi_progid
類別和關鍵字
本範例使用下列類別:
CDialog (MFC), CComObject (ATL), IConnectionPointImpl<CDuckDoer> (ATL)
本範例使用下列關鍵字:
_ASSERTE; _tcslen; _VERIFY; AddRef; Advise; BEGIN_COM_MAP; BEGIN_CONNECTION_POINT_MAP; BEGIN_MSG_MAP; BEGIN_OBJECT_MAP; CComCoClass; CComModule::Unlock; CComObjectRootEx; CDialogImpl; CenterWindow; CoInitialize; COM_INTERFACE_ENTRY; COM_INTERFACE_ENTRY_IMPL; COMMAND_HANDLER; COMMAND_ID_HANDLER; CONNECTION_POINT_ENTRY; CoSuspendClassObjects; CoUninitialize; Create; DECLARE_CLASSFACTORY_SINGLETON; DECLARE_NOT_AGGREGATABLE; DECLARE_REGISTRY_RESOURCEID; DestroyWindow; DispatchMessage; EnableWindow; END_COM_MAP; END_CONNECTION_POINT_MAP; END_MSG_MAP; END_OBJECT_MAP; ExitProcess; FindConnectionPoint; GetCommandLine; GetDC; GetDlgItem; GetMessage; GetTextExtentPoint32; IConnectionPointContainerImpl; IConnectionPointImpl; Init; IsWindowVisible; MESSAGE_HANDLER; MessageBox; OBJECT_ENTRY; OleInitializeCoCreateInstance; OnCancel; OnFlap; OnInitDialog; OnOK; OnPaddle; OnWalk OnQuack; PostThreadMessage; QueryInterface; RecalcListboxExtent; RegisterClassObjects; RegisterServer; reinterpret_cast; ReleaseDC; RevokeClassObjects; SendMessage; SetOwner; SetWindowText; ShowStatus; ShowWindow; Unadvise; UnregisterServer; UNUSED_ALWAYS; UpdateRegistryFromResource; UpdateWindow; USES_CONVERSION
注意事項: |
---|
部分範例 (包括本範例) 尚未經過改寫,無法反映出目前在 Visual C++ 精靈、程式庫以及編譯器方面的變更,不過還是可以示範如何完成您要進行的工作。 |