CONNECT 屬性範例:示範連接點的實作和使用
更新:2007 年 11 月
CONNECT 屬性範例說明在多執行緒環境中連接點 (IConnectionPointContainer 和 IConnectionPoint 介面) 的實作和使用。
範例示範許多常用的 IDL、COM 和編譯器屬性,包括 support_errorinfo、event_source 和 event_receiver。
安全性注意事項: |
---|
這個程式碼範例僅供概念說明之用,同時因為範例中的程式碼撰寫並沒有周全的顧及所有安全性問題,所以本範例不適用於實際執行的應用程式或網站中。如果使用者擅自將範例程式碼用於其他意圖而導致連帶事件或重大損害時,Microsoft 將不承擔任何責任。 |
若要取得範例和指示以便進行安裝:
按一下 Visual Studio [說明] 功能表上的 [範例]。
如需詳細資訊,請參閱尋找範例檔案。
最新版的完整範例清單可從 Visual Studio 2008 範例網頁 (英文) 取得。
您也可以將範例置於電腦硬碟中。根據預設,範例和讀我檔案都會複製到 \Program Files\Visual Studio 9.0\Samples\ 下的資料夾中。對於所有的 Visual Studio Express 版,所有範例都可在線上找到。
建置和執行範例
若要建置和執行這個範例
開啟 connect.sln 方案檔。
在 [建置] 功能表中,按一下 [建置方案]。
選取您想要執行的用戶端 (Drive 或 MDrive),將它做為啟始專案 (以滑鼠右鍵按一下專案資料夾,然後按一下 [設定為啟始專案])。有關用戶端的詳細資訊可於<範例如何操作>章節中找到。
在 [偵錯] 功能表上,按一下 [啟動但不偵錯]。
範例如何操作
伺服程式是在 Connect.dll 內實作。這個 DLL 允許建立一個由 CRandom C++ 類別實作的 CoRandom COM 物件。這個 COM 物件會支援 IRandom (雙重介面) 和 IConnectionPointContainer,且接受 IRandomEvent 介面的連接。
IRandom 介面支援下列方法:
Start:啟動物件內部的執行緒
Stop:停止物件內部的執行緒
StopAll:停止所有執行中的執行緒
當執行時,物件中的次要執行緒就會透過連接點持續引發事件。
提供兩個用戶端:Drive 和 MDrive,您可以在 Drive 和 MDrive 子目錄中找到這兩個用戶端。
Drive.exe 是一個簡單的主控台應用程式,這個應用程式會提供實作 IRandomEvent 介面的單一物件。它會建立 CoRandom 物件,在連接點上呼叫 Advise 和 Unadvise,並且讓 CoRandom 物件將事件引發至磁碟的物件。
Mdrive.exe 是一個 MFC 對話方塊架構的應用程式,能夠建立多個通知接收 (Advise Sink),並控制伺服程式建立的執行緒數量。當您執行 Mdrive.exe 時,至少要按一次 [啟動] 按鈕,然後連續按幾次 Advise 按鈕。每按一下 [Advise] 按鈕,就會加入一個連結點,讓顯示畫面變得更寬。如果您沒有按一下 [Advise] 按鈕,您將不會在顯示中看到任何動作。
屬性
本範例使用下列屬性:
Connect coclass, default, dll, dual, event_source, helpstring, id, in, module, name, object, out, pointer_default, progid, support_error_info, uuid, vi_progid
Connect/drive event_receiver, module
關鍵字
本範例使用下列關鍵字:
AfxGetApp; AfxMessageBox; AtlAdvise; ATLASSERT; AtlUnadvise; BEGIN_COM_MAP; BEGIN_CONNECTION_POINT_MAP; BEGIN_MESSAGE_MAP; BEGIN_OBJECT_MAP; CComCoClass; CComModule::GetClassObject; CComModule::GetLockCount; CComModule::Init; CComModule::RegisterServer; CComModule::Term; CComModule::UnregisterServer; CComObject::CreateInstance; CComObjectRoot; CDialog::OnCancel; CDialog::OnOK; CloseHandle; CoCreateInstance; COleTemplateServer::RegisterAll; COM_INTERFACE_ENTRY; COM_INTERFACE_ENTRY_IMPL; COM_INTERFACE_ENTRY2; CONNECTION_POINT_ENTRY; CoUninitialize; CreateEvent; CreateThread; DECLARE_REGISTRY_RESOURCEID; DisableThreadLibraryCalls; DoModal; DrawIcon; END_COM_MAP; END_CONNECTION_POINT_MAP; END_MESSAGE_MAP; END_OBJECT_MAP; GdiFlush; GetClientRect; GetDlgItem; GetTickCount; GetUnknown; IConnectionPointContainerImpl; IConnectionPointImpl; IDispatchImpl; ISupportErrorInfo; LoadIcon; Lock; memset; OBJECT_ENTRY; ON_COMMAND; puts; ReleaseDC; SendMessage; SetEvent; SetIcon; SetPixel; Sleep; Unadvise; Unlock; WaitForSingleObject
注意事項: |
---|
部分範例 (包括本範例) 尚未經過改寫,無法反映出目前在 Visual C++ 精靈、程式庫以及編譯器方面的變更,不過還是可以示範如何完成您要進行的工作。 |