blob: 0d47feb5a226c30b9d621752f9f6e1dd11c266bd [file] [log] [blame]
From 86ca5a388b5f8786b585037c95832bcf65e22e97 Mon Sep 17 00:00:00 2001
From: didroe <didroe@0a9a9e18-0b8b-11df-b730-f17d7b42d8b9>
Date: Wed, 27 Jan 2010 21:38:14 +0000
Subject: [PATCH] Initial commit
---
Win7AppId.cpp | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 88 insertions(+)
create mode 100755 Win7AppId.cpp
diff --git a/Win7AppId.cpp b/Win7AppId.cpp
new file mode 100755
index 0000000..9f8e38b
--- /dev/null
+++ b/Win7AppId.cpp
@@ -0,0 +1,88 @@
+// Win7AppId.cpp : Defines the entry point for the console application.
+//
+
+#include "stdafx.h"
+
+#include <windows.h>
+#include <shobjidl.h>
+#include <propkey.h>
+
+#include <iostream>
+
+using namespace std;
+
+EXTERN_C const PROPERTYKEY DECLSPEC_SELECTANY PKEY_AppUserModel_ID =
+ { { 0x9F4C2855, 0x9F79, 0x4B39,
+ { 0xA8, 0xD0, 0xE1, 0xD4, 0x2D, 0xE1, 0xD5, 0xF3, } }, 5 };
+
+void die(string message) {
+ cout << "Error: " << message.c_str() << endl;
+ exit(1);
+}
+
+void doOrDie(HRESULT hr, string message) {
+ if (!SUCCEEDED(hr)) {
+ die(message);
+ }
+}
+
+int _tmain(int argc, _TCHAR* argv[])
+{
+ doOrDie(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED),
+ "Failed to initialise COM");
+
+ IShellLink *link;
+ doOrDie(CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&link)),
+ "Failed to create ShellLink object");
+
+ IPersistFile* file;
+ doOrDie(link->QueryInterface(IID_PPV_ARGS(&file)),
+ "Failed to obtain PersistFile interface");
+
+ doOrDie(file->Load(argv[1], STGM_READWRITE),
+ "Failed to load shortcut file");
+
+ IPropertyStore* store;
+ doOrDie(link->QueryInterface(IID_PPV_ARGS(&store)),
+ "Failed to obtain PropertyStore interface");
+
+ PROPVARIANT pv;
+ doOrDie(store->GetValue(PKEY_AppUserModel_ID, &pv),
+ "Failed to retrieve AppId");
+
+ if (pv.vt != VT_EMPTY) {
+ if (pv.vt != VT_LPWSTR) {
+ cout << "Type: " << pv.vt << endl;
+ die("Unexpected property value type");
+ }
+
+ wcout << "Current AppId: " << pv.pwszVal << endl;
+ } else {
+ cout << "No current AppId" << endl;
+ }
+ PropVariantClear(&pv);
+
+ if (argc > 2) {
+ wcout << "New AppId: " << argv[2] << endl;
+
+ pv.vt = VT_LPWSTR;
+ pv.pwszVal = argv[2];
+
+ doOrDie(store->SetValue(PKEY_AppUserModel_ID, pv),
+ "Failed to set AppId");
+ PropVariantClear(&pv);
+
+ doOrDie(store->Commit(),
+ "Failed to commit AppId property");
+
+ doOrDie(file->Save(NULL, TRUE),
+ "Failed to save shortcut");
+ }
+
+ store->Release();
+ file->Release();
+ link->Release();
+
+ return 0;
+}
+