Continuing our series on getting the computer’s serial number in desktop apps in various languages, next up is C++/CX.
From Visual Studio, create a new C++ Console Application that goes like this:
#include <windows.h>
#include <stdio.h> // Horrors! Mixing C and C++!
[Platform::STAThread]
int __cdecl wmain(int, wchar_t**)
{
CCoInitialize init;
auto serialNumber = Windows::System::Profile::SystemManufacturers::
SmbiosInformation::SerialNumber;
wprintf(L"Serial number = %ls\n", serialNumber->Data());
return 0;
}
Before building, right-click the Project in Visual Studio and select Properties, and then make these changes:
- Configuration Properties, C/C++, General, Additional
#usingDirectories: Add these two directories, adjusting as appropriate for where you installed Visual Studio and the Windows SDK. C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcpackages(so the compiler can findplatform.winmd)C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.16299.0(so the compiler can findwindows.winmd)¹- Configuration Properties, C/C++, General, Consume Windows Runtime Extension: Set to Yes (/ZW).
- Configuration Properties, C/C++, Code Generation, Enable Minimal Rebuild: Set to No (/Gm-).
- Configuration Properties, Linker, Inputs, Additional Dependencies: add
windowsapp.lib.
Okay, now you can build and run the program.
Consuming Windows Runtime objects in C++/CX is more convenient than accessing them raw, but it is a nonstandard Microsoft extension.
You don’t have to build your entire application in C++/CX. You can write part of it in plain C++, and part of it in C++/CX, and the link the two pieces together. The Casting page on MSDN explains how to convert between a hat-pointer and a regular pointer.
Okay, so setting up the project was kind of ugly, but that’s okay, because things will get better before they get better. Up next is C++/WinRT.
¹ There are two copies of windows.winmd, a good one in the directory I gave above, and a bad one in the directory UnionMetadata\Facade. If you use the bad one, you get an internal compiler error. Larry Osterman tried to explain to me what the bad copy in Facade was for, but all I heard was the wah-wah of Charlie Brown’s teacher.
0 comments