Connecting to a WPD device in C#

This is the C# equivalent of an earlier C++ post on connecting to a WPD device. We’ll concentrate on the implementation here – you may refer back to that earlier post for further explanation. // Create our client information collection PortableDeviceApiLib.IPortableDeviceValues pValues = (PortableDeviceApiLib.IPortableDeviceValues) new PortableDeviceTypesLib.PortableDeviceValuesClass(); // We have to provide at the least our name,…

3

Marshalling variant properties in C#

This post is a continuation of the one covering WPD property retrieval in C#. That post explained how to marshal strings and the basic int properties. Handling other types such as VT_DATE and VT_BOOL is trickier so I’ll try to cover them here. VT_DATE VT_DATE variants hold the date time value in a field of type…

3

WPD Content Enumeration in C#

WPD content enumeration in C# is pretty close to the C++ style. Here’s a basic example that enumerates the object IDs of the objects present on the device. static void Enumerate( ref PortableDeviceApiLib.IPortableDeviceContent pContent, string parentID, string indent) { // // Output object ID // Console.WriteLine(indent + parentID); indent += ” “; // // Enumerate…

0

Setting WPD properties in C#

Since setting a WPD property requires manipulating a PROPVARIANT structure through interop, we must make use of the marshalling rules we set in our last post. We’ll take a look at a function that allows string properties to be set. static void SetStringValue( PortableDeviceApiLib.PortableDeviceClass pPortableDevice, string objectID, ref PortableDeviceApiLib._tagpropertykey propKey, string newValue) { // //…

0

WPD property retrieval in C#

WPD property values are retrieved as PROPVARIANTs through the WPD API. Unfortunately there is no native support for PROPVARIANTs in C#. To correctly retrieve the property values (or anything that is in a PROPVARIANT) through the WPD API in C#, we must use marshalling. PortableDeviceApiLib.tag_inner_PROPVARIANT is the data-type exposed through the WPD Interop layer. This…

9

Where are the WPD property keys in C#?

If you followed the exercise from our first C# post, you must have noticed that the PortableDeviceApi and PortableDeviceTypes typelibs don’t expose the WPD property keys such as WPD_OBJECT_ID, WPD_OBJECT_FORMAT, etc. This can be a major blocker since for starters, we need to specify a basic set of client information properties to open a connection to…

4

Flying Wiimotes

I just bought a Wii and it has totally changed my gamer attitude, and I wasn’t even a gamer to start with. No more button mashing anymore – arm-swinging and flailing with some actual hand-eye coordination is what it’s all about. Of course with all the arm-thrashing, the controllers are bound to gain critical velocity and…

1

Enumerating WPD devices in C#

Let’s take a look at how we can enumerate WPD devices in C#. This post assumes that you already have a project set up using these instructions. (Update: You will also need to follow the disassembly/reassembly instructions below for this to work correctly.) static void Main(string[] args) { // // Get an instance of the…

21

C# and the WPD API

There currently is no managed/C# flavor of the WPD API. This, of course, doesn’t mean that you are locked out from using the WPD API if you want to use C#. Since the API is a set of COM interfaces, we simply have to interop across from C#. Granted it isn’t as easy as a…

3

Help! WPD API calls randomly fail with 0x800700AA (ERROR_BUSY)

If you notice your API calls are randomly failing with HRESULT_FROM_WIN32(ERROR_BUSY) / 0x800700AA / -2147024726, then it’s likely that the device driver is indeed busy doing something else. It could be that WMP is syncing content to the device, or maybe Explorer needs to refresh its view and is enumerating content on the device. So what…

2