CONNECT Sample: Demonstrates Implementation and Use of Connection Points
The CONNECT sample illustrates the implementation and use of connection points (the IConnectionPointContainer and IConnectionPoint interfaces) in a multithreaded environment.
The CONNECT attributes sample is the attributed version of this sample.
Building and Running the Sample
To build and run this sample
- Open the solution file connect.sln.
- From the Build menu, click Build Solution.
- From the Debug menu, click Start to run Mdrive.exe.
You can build and run Drive.exe from the command line, or build and run Mdrive.exe from the development environment. More information about the clients can be found in How the Sample Works.
How the Sample Works
The server is implemented in Connect.dll. This DLL allows the creation of a
CoRandom COM object, implemented by the
CRandom C++ class. The COM object supports
IRandom (a dual interface) and IConnectionPointContainer, and it accepts connections for the
IRandom interface supports the following methods:
Start— starts a thread inside the object
Stop— stops a thread inside the object
StopAll— stops all the running threads
When running, the secondary threads inside the object keep firing events through the connection point.
Two clients are provided: Drive and Mdrive. They can be found in the Drive and Mdrive subdirectories.
- Drive.exe is a simple console application that provides a single object implementing the
IRandomEventinterface. It creates a
CoRandomobject, calls Advise/Unadvise on the connection point, and makes the
CoRandomobject fire events into the drive's object.
- Mdrive.exe is an MFC dialog-based application that can create multiple advise sinks and control the number of threads the server creates. When you run Mdrive.exe, click the Start button at least once, then click the Advise button several times. Each click of the Advise button adds a connection point, which makes the display wider. If you do not click the Advise button, you will not see any activity in the display.
This sample uses the following keywords:
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