<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Windows Portable Devices Team Blog : PnP</title><link>http://blogs.msdn.com/wpdblog/archive/tags/PnP/default.aspx</link><description>Tags: PnP</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>How to Receive WPD Arrival Event Notifications</title><link>http://blogs.msdn.com/wpdblog/archive/2007/03/17/how-to-receive-wpd-device-arrival-events.aspx</link><pubDate>Sat, 17 Mar 2007 04:25:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1897354</guid><dc:creator>wpdblog</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/wpdblog/comments/1897354.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wpdblog/commentrss.aspx?PostID=1897354</wfw:commentRss><description>&lt;p&gt;If you&amp;nbsp;followed the &lt;a href="http://msdn.microsoft.com/en-us/library/aa528331.aspx" title="WPD Event Constants" mce_href="http://msdn.microsoft.com/en-us/library/aa528331.aspx"&gt;standard WPD events&lt;/a&gt;&amp;nbsp;link in our &lt;a href="http://blogs.msdn.com/wpdblog/archive/2007/03/16/how-to-post-events-from-your-wpd-driver.aspx" class="" title="Posting WPD Driver Events" mce_href="http://blogs.msdn.com/wpdblog/archive/2007/03/16/how-to-post-events-from-your-wpd-driver.aspx"&gt;previous post&lt;/a&gt;&amp;nbsp;on WPD driver events, you&amp;nbsp;may have seen&amp;nbsp;the following&amp;nbsp;event&amp;nbsp;definition:&lt;/p&gt;
&lt;table style="width: 645px; height: 121px;" border="0" cols="2" frame="below" rules="rows"&gt;
&lt;tbody&gt;
&lt;tr valign="top"&gt;
&lt;td width="45%"&gt;WPD_EVENT_DEVICE_REMOVED&lt;/td&gt;
&lt;td width="55%"&gt;This event is sent when a driver for a device is being unloaded. This is typically a result of the device being unplugged. 
&lt;p&gt;Clients should release the &lt;b&gt;IPortableDevice&lt;/b&gt; interface they have open on the device specified in WPD_EVENT_PARAMETER_PNP_DEVICE_ID.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;In a nutshell, when a WPD device disconnects,&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/dd388546%28VS.85%29.aspx" title="IPortableDeviceEventCallback::OnEvent" mce_href="http://msdn.microsoft.com/en-us/library/dd388546(VS.85).aspx"&gt;IPortableDeviceEventCallback::OnEvent&lt;/a&gt;&amp;nbsp;is called with this specific event GUID and the PnP Device ID&amp;nbsp;in the event parameters, allowing applications to&amp;nbsp;clean up the associated WPD interfaces for that device instance, display UI, etc.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Having an event to tell an application when a device is disconnected can help&amp;nbsp;applications build richer or smarter&amp;nbsp;device scenarios.&amp;nbsp; &amp;nbsp; &lt;b&gt;Why isn't there a device&amp;nbsp;arrival&amp;nbsp;event,&amp;nbsp;ala&amp;nbsp;WPD_EVENT_DEVICE_&lt;i&gt;ARRIVED&lt;/i&gt;, to cover the converse Disconnected -&amp;gt; Connected case?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The reason this hypothetical event doesn't exist is that WPD events utilize the&amp;nbsp;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa511339.aspx" class="" title="IWDFDevice::PostEvent" mce_href="http://msdn2.microsoft.com/en-us/library/aa511339.aspx"&gt;IWDFDevice::PostEvent&lt;/a&gt; mechanism, which requires the WPD driver to up and running (with the device connected).&amp;nbsp;&amp;nbsp;&amp;nbsp; Consequently, to receive such events, a WPD application has to invoke IPortableDevice::Advise and maintain an open IPortableDevice connection.&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;p mce_keep="true"&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p mce_keep="true"&gt;&lt;b&gt;Device Interface&amp;nbsp;Arrival Events to the Rescue&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Fortunately, Plug-and-Play&amp;nbsp;provides your application with the ability to receive broadcast device notifications on device interfaces, including WPD's.&amp;nbsp; This standard mechanism has existed long before WPD, and is documented &lt;a href="http://msdn2.microsoft.com/en-us/library/aa363432.aspx" class="" title="Registering for Device Notification" mce_href="http://msdn2.microsoft.com/en-us/library/aa363432.aspx"&gt;here&lt;/a&gt;&amp;nbsp;in MSDN.&amp;nbsp;&amp;nbsp; The following code snippets show how to register for WPD device interface notifications, and how to handle the corresponding arrival event.&lt;/p&gt;&lt;span style="font-size: 9pt; font-family: 'courier-new';"&gt;&lt;pre&gt;//&lt;br&gt;// Step 1: Registering for WPD device interface PnP notification events&lt;br&gt;//&lt;br&gt;&lt;br&gt;// The WPD device interface GUID&lt;br&gt;#define WPD_DEVINTERFACE L"{6ac27878-a6fa-4155-ba85-f98f491d4f33}"&lt;br&gt;&lt;br&gt;GUID guidDevInterface            = GUID_NULL;&lt;br&gt;DEV_BROADCAST_DEVICEINTERFACE db = {0};&lt;br&gt;db.dbcc_size = sizeof(db);&lt;br&gt;db.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;&lt;br&gt;CLSIDFromString(WPD_DEVINTERFACE, &amp;amp;guidDevInterface);&lt;br&gt;db.dbcc_classguid  = guidDevInterface;&lt;br&gt;&lt;br&gt;hDevNotify = RegisterDeviceNotificationW(hWnd, &amp;amp;db, DEVICE_NOTIFY_WINDOW_HANDLE);&lt;br&gt;&lt;br&gt;do error checking ...&lt;br&gt;&lt;br&gt;&lt;br&gt;//&lt;br&gt;// Step 2: Processing the DBT_DEVICEARRIVAL event when a WPD device is connected&lt;br&gt;//&lt;br&gt;&lt;br&gt;LRESULT WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)&lt;br&gt;{  &lt;br&gt;   switch (uMsg)&lt;br&gt;   {&lt;br&gt;       ....&lt;br&gt;&lt;br&gt;       case WM_DEVICECHANGE:&lt;br&gt;       {&lt;br&gt;          switch(wParam) &lt;br&gt;          {	    &lt;br&gt;             case DBT_DEVICEARRIVAL:&lt;br&gt;             {&lt;br&gt;                 PDEV_BROADCAST_HDR pdbh = (PDEV_BROADCAST_HDR)lParam;&lt;br&gt;                 if (pdbh != NULL &amp;amp;&amp;amp; pdbh-&amp;gt;dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)&lt;br&gt;                 {&lt;br&gt;                     PDEV_BROADCAST_DEVICEINTERFACE pdbi = (PDEV_BROADCAST_DEVICEINTERFACE)lParam;&lt;br&gt;            &lt;br&gt;                     if (IsEqualGUID(pdbi-&amp;gt;dbcc_classguid, guidDevInterface)) &lt;br&gt;                     {&lt;br&gt;                         // Initialization is skipped here for brevity&lt;br&gt;                         // Use the symbolic name to open a PortableDevice connection&lt;br&gt;                         // pClientInfo is an IPortableDeviceValues containing the client information&lt;br&gt;                         // NOTE: Use a separate thread if your code could block&lt;br&gt;                         hr = pIPortableDevice-&amp;gt;Open(pdbi-&amp;gt;dbcc_name, pClientInfo);&lt;br&gt;&lt;br&gt;                         do more error checking ...&lt;br&gt;                     }&lt;br&gt;		 }&lt;br&gt;                 break;         &lt;br&gt;             }&lt;br&gt;             &lt;br&gt;             ...&lt;br&gt; &lt;br&gt;          } // switch (wParam)&lt;br&gt;       }&lt;br&gt;       break;&lt;br&gt;       ....&lt;br&gt;   } // switch (uMsg)&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;/pre&gt;&lt;/span&gt;
&lt;p mce_keep="true"&gt;To summarize, the application will receive a &lt;a onclick="javascript:Track('ctl00_LibFrame_ctl01|ctl00_LibFrame_ctl04',this);" href="http://msdn2.microsoft.com/en-us/library/aa363480.aspx"&gt;WM_DEVICECHANGE&lt;/a&gt; message for the &lt;a onclick="javascript:Track('ctl00_LibFrame_ctl01|ctl00_LibFrame_ctl05',this);" href="http://msdn2.microsoft.com/en-us/library/aa363205.aspx"&gt;DBT_DEVICEARRIVAL&lt;/a&gt;&amp;nbsp;event when the device is connected.&amp;nbsp;&amp;nbsp; DEV_BROADCAST_DEVICEINTERFACE.dbcc_name is equivalent to the WPD PnP Device ID, which the application can use when calling IPortableDevice::Open.&lt;/p&gt;
&lt;p mce_keep="true"&gt;The &lt;a href="http://msdn2.microsoft.com/en-us/library/aa363431.aspx" class="" title="RegisterDeviceNotification" mce_href="http://msdn2.microsoft.com/en-us/library/aa363431.aspx"&gt;guidelines&lt;/a&gt; for processing Plug-and-Play messages apply: the event handler should process the event as quickly as possible, using a separate thread if there's a possibility of blocking execution, to avoid undue system hangs.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p mce_keep="true"&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p mce_keep="true"&gt;&lt;b&gt;Choices of Device Removal Events&lt;/b&gt;&lt;/p&gt;
&lt;p mce_keep="true"&gt;The application will also receive a DBT_DEVICEREMOVECOMPLETE&amp;nbsp;event, which can&amp;nbsp;be useful for&amp;nbsp;e.g. placing arrival and removal handlers in the same code module.&amp;nbsp;&amp;nbsp; The difference between&amp;nbsp;this&amp;nbsp;event&amp;nbsp;and WPD_EVENT_DEVICE_REMOVED is subtle.&amp;nbsp;&amp;nbsp; The latter&amp;nbsp;is&amp;nbsp;a custom PnP event that&amp;nbsp;is sent via WUDF&amp;nbsp;during&amp;nbsp;&lt;i&gt;unloading of&amp;nbsp;the WPD&amp;nbsp;driver &lt;/i&gt;(usually caused by&amp;nbsp;a device unplug); whereas DBT_DEVICEREMOVECOMPLETE is triggered&amp;nbsp;by the &lt;i&gt;removal of&amp;nbsp;a&amp;nbsp;device interface&lt;/i&gt; (also caused by&amp;nbsp;a device unplug).&amp;nbsp;&amp;nbsp; Usually, WPD&amp;nbsp;applications that just&amp;nbsp;want&amp;nbsp;a notification when&amp;nbsp;WPD devices are disconnected&amp;nbsp;can subscribe to either&amp;nbsp;event and get the same effect.&lt;/p&gt;
&lt;p mce_keep="true"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p mce_keep="true"&gt;&lt;b&gt;Further Reading (and more code samples)&lt;/b&gt;&lt;/p&gt;
&lt;p mce_keep="true"&gt;To learn more&amp;nbsp;on how to use&amp;nbsp;PnP device&amp;nbsp;notifications, refer to this detailed &lt;a href="http://www.codeproject.com/useritems/HwDetect.asp" class="" title="Detecting H/W Insertion or Removal - The Code Project" mce_href="http://www.codeproject.com/useritems/HwDetect.asp"&gt;article&lt;/a&gt; from The Code Project.&lt;/p&gt;
&lt;p mce_keep="true"&gt;&lt;i&gt;&lt;/i&gt;&amp;nbsp;&lt;/p&gt;
&lt;p mce_keep="true"&gt;&lt;i&gt;This posting is provided "AS IS" with no warranties, and confers no rights.&lt;/i&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1897354" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wpdblog/archive/tags/SDK/default.aspx">SDK</category><category domain="http://blogs.msdn.com/wpdblog/archive/tags/PnP/default.aspx">PnP</category></item></channel></rss>