Coding to the Windows SDK
In the near future I'll be posting code examples that compile and run. In case you'd like to follow along, here's my personal setup. My code should compile on RC1 also, so go ahead and use RC1 if that's what you can get a hold of.
- Windows Vista Sept CTP (Build 5728)
- The matching Windows SDK Sept CTP
- Visual Studio 2005 C++ Express Edition
RC1 NOTE: If you have Windows Vista RC1, be sure to grab the matching Windows RC1 SDK. The versions must match or you will get runtime errors.
The best thing is, you can get all these downloads for FREE! RC1 will expire in July 2007 but it's a good way to play with Vista before it ships.
The first thing to do is point Visual Studio at the Windows SDK. Click Tools->Options...->Projects and Solutions->VC++ Directories and insert the following directories at the top of each list. I'm a purist, so I removed the other directories too, but you probably don't have to do that.
RC1 NOTE: The RC1 SDK for some reason installs its files to a v1.0 directory. Adjust the paths below accordingly.
- Executable files:
- G:\Program Files\Microsoft SDKs\Windows\v6.0\VC\Bin
- G:\Program Files\Microsoft SDKs\Windows\v6.0\Bin
- $(PATH)
- Include files:
- G:\Program Files\Microsoft SDKs\Windows\v6.0\VC\Include
- G:\Program Files\Microsoft SDKs\Windows\v6.0\Include
- Library files:
- G:\Program Files\Microsoft SDKs\Windows\v6.0\VC\Lib
- G:\Program Files\Microsoft SDKs\Windows\v6.0\Lib
- Source files:
- G:\Program Files\Microsoft SDKs\Windows\v6.0\VC\Include
- G:\Program Files\Microsoft SDKs\Windows\v6.0\Include
- Exclude directories:
- G:\Program Files\Microsoft SDKs\Windows\v6.0\VC\Include
- G:\Program Files\Microsoft SDKs\Windows\v6.0\Include
As a purist, I like to start with empty C++ console applications. Let's create one and create propshow.cpp. I'll fill this file out later, but for now, let's just type:
#include <windows.h>
#include <propsys.h>
#include <propvarutil.h>
#include <propkey.h>
#include <stdio.h>
#pragma comment(lib, "propsys.lib")
#pragma comment(lib, "ole32.lib")
int wmain(__in int argc, __in_ecount(argc) WCHAR **argv)
{
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
if (SUCCEEDED(hr))
{
PROPVARIANT propvar = {0};
hr = InitPropVariantFromUInt32(RATING_FOUR_STARS_SET, &propvar);
if (SUCCEEDED(hr))
{
WCHAR szValue[100] = L"\0";
hr = PSFormatForDisplay(PKEY_Rating, propvar, PDFF_DEFAULT, szValue, ARRAYSIZE(szValue));
if (SUCCEEDED(hr))
{
wprintf(L"The rating is %s.\n", szValue);
}
PropVariantClear(&propvar);
}
CoUninitialize();
}
}
That's it! Compile, run, and it should print "The rating is 4 Stars."
-Ben Karas
Comments
- Anonymous
October 02, 2006
It's interesting that you expliclity pass COINIT_DISABLE_OLE1DDE to CoInitializeEx; I've never really seen it used before. Is it something that we "should" usually do? I'm guessing it helps reduce attack surface area or something? - Anonymous
October 02, 2006
The comment has been removed - Anonymous
November 05, 2006
This coding expedition has developed a tool that can dump out all the properties on a file. If you are