ATLDuck: Uses Connection Points with ATL

Click to open or copy the ATLDuck project files.

The ATLDuck sample consists of two projects: atlduck and duck. 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 IDuckInt interface for sinks which have called IConnectionPoint::Advise.

This sample also makes use of the marshalling code needed to connect interfaces in different processes.

Building the Sample

  1. Open workspace atlduck.dsw, which includes the two projects: duck and atlduck. From the command line, and having the correct folder as current directory, build the DLLs for the marshalling code:
    nmake –f duckps.mk
    nmake –f atlduckps.mk
    

    These commands will build the files duckps.dll and atlduckps.dll, respectively.

  2. Register the DLLs by issuing the following commands:
    regsvr32 duckps.dll
    regsvr32 atlduckps.dll


  1. Register the atlduck local server, running the application with the following command:
    atlduck /regserver
    

The sample is ready use.

Running the Sample

Start one or more instances of duck.exe.

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

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. A new dialog box, issued by atlduck.exe, appears. This dialog box shows a button for each one of the functions in the IDuckInt interface, as well as a list box with all 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.

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