// SummaryPropPage.
cpp : Defines the entry point
// for the application.
//
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <ole2.h>
// Implicitly link [Link]
#pragma comment( lib, "[Link]" )
const FMTID PropSetfmtid ={
/* F29F85E0-4FF9-1068-AB91-08002B27B3D9 */
0xf29f85e0,
0x4ff9,
0x1068,
{0xab, 0x91, 0x08, 0x00, 0x2b, 0x27, 0xb3, 0xd9 }
};
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
IPropertySetStorage *pPropSetStg = NULL;
IPropertyStorage *pPropStg = NULL;
PROPSPEC propspec;
PROPVARIANT propWrite;
PROPVARIANT propRead;
HRESULT hr = S_OK;
// Open a file and a property set within it.
hr = StgOpenStorageEx( L"C:\\[Link]",
STGM_DIRECT|STGM_SHARE_EXCLUSIVE|
STGM_READWRITE,
STGFMT_ANY,
// STGFMT_STORAGE //Structured
//Storage property sets
// STGFMT_FILE //NTFS file system
//property sets
0,
NULL,
NULL,
IID_IPropertySetStorage,
reinterpret_cast<void**>(&pPropSetStg) );
if( FAILED(hr) )
throw L"Failed StgOpenStorageEx";
/*
hr = pPropSetStg->Open( PropSetfmtid,
STGM_WRITE|
STGM_SHARE_EXCLUSIVE,
&pPropStg );
*/
hr = pPropSetStg->Create( PropSetfmtid, NULL,
PROPSETFLAG_DEFAULT,
STGM_CREATE|STGM_READWRITE|
STGM_SHARE_EXCLUSIVE,
&pPropStg );
if( FAILED(hr) )
throw L"Failed IPropertySetStorage::Open";
//we can identify any property through its Name or its ID
// [Link] = PRSPEC_LPWSTR;
// [Link] = L"Title";
[Link] = PRSPEC_PROPID;
[Link] = 0x00000002;
//specify the value of property
[Link] = VT_LPWSTR;
[Link] = L"this value set through code";
hr = pPropStg->WriteMultiple( 1, &propspec,
&propWrite, PID_FIRST_USABLE );
if( FAILED(hr) )
throw L"Failed IPropertyStorage::WriteMultiple";
pPropStg->Release();
pPropStg = NULL;
//again open the property set
hr = pPropSetStg->Open( PropSetfmtid,
STGM_READ|STGM_SHARE_EXCLUSIVE,
&pPropStg );
if( FAILED(hr) )
throw L"Failed IPropertySetStorage::Open";
// Read the property back and validate it
hr = pPropStg->ReadMultiple( 1, &propspec, &propRead );
if( FAILED(hr) )
throw L"Failed IPropertyStorage::ReadMultiple";
char* str = new char [wcslen([Link]) + 1];
// the "%S" will implicitly convert UNICODE to ANSI.
wsprintfA ( str, "%S", [Link]);
//if you want to display
// MessageBox(NULL,str,"Reading Value",MB_OK);
if( hr == S_FALSE )
throw L"Property didn't exist after "
L"reopening the property set";
else if( [Link] != [Link] )
throw L"Property types didn't match "
L"after reopening the property set";
else if( wcscmp( [Link], [Link] ) != 0 )
throw L"Property values didn't match"
L" after reopening the property set";
else
wprintf( L"Success\n" );
return 0;
}