# ATLDuck Sample: Uses Connection Points with ATL

The ATLDuck sample consists of four projects: atlduck, duck and their respective proxy/stub projects atlduckPS and duckPS. The duck project creates an instance of an object that implements the IDuckInt interface. This interface includes four member functions: Flap, Paddle, Quack, and Walk.

The second project, atlduck, has a connection point for the IDuckInt interface (that is, it knows how to use the interface but does not implement it). Only a single instance of this object will be created. Once the connection is established between the two applications, atlduck will call the functions in the IDuckInt interface for sinks that have called IConnectionPoint::Advise.

This sample also makes use of the marshaling code (through atlduckPS and duckPS) needed to connect interfaces in different processes.

The ATLDuck attributes sample is the attributed version of this sample.

Security Note
This sample code is provided to illustrate a concept and should not be used in applications or Web sites, as it may not illustrate the safest coding practices.

# Building and Running the Sample

#### To build this sample

1. Open the atlduck.sln solution file.

2. From the Build menu, click Build Solution. This will build all four projects and do the necessary registration. The following files will be created:

   - atlduck.exe, an EXE server

   - atlduckPS.dll, a marshalling DLL for the atlduck.exe server

   - duck.exe, an EXE client

   - duckPS.dll, a marshalling DLL for the duck.exe client

#### To run this sample

1. Start one or more instances of duck.exe.

   Note
   Opening several instances of duck.exe demonstrates connection points most effectively.

2. A dialog box appears. In the dialog box, click the button Create DoDuck Object. When you click this button, the application creates an instance of an object with class `ID CLSID_DuckDoer`, running atlduck.

3. A new dialog box, issued by atlduck.exe, appears. This dialog box shows a button for each function in the IDuckInt interface, as well as a list box with the connections to active sinks, and their cookies. From the duck dialog boxes, you can either Advise or Unadvise the connection point. Depending on your choice, you will receive or not receive notifications from the sources. The notification, when you receive it, will show in the status edit field. Additionally, ATLDuck demonstrates the value of the cookie supplied by the connection point when the connection is advised.

# Classes and Keywords

The sample use the following classes:

CDialog (MFC), CComObject (ATL), IConnectionPointImpl<CDuckDoer> (ATL)

This sample uses the following keywords:

_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