代码里只修改了备注,其他字段相同原理
#include <stdio.h> #include <windows.h> #include <ole2.h> #pragma comment( lib, "ole32.lib" ) int GetFileComments(wchar_t *filename, wchar_t *buf, size_t len) { IPropertySetStorage *pPropSetStg = NULL; IPropertyStorage *pPropStg = NULL; PROPSPEC propspec; PROPVARIANT propWrite; PROPVARIANT propRead; HRESULT hr; size_t l; // Open a file and a property set within it. hr = StgOpenStorageEx(filename, STGM_SHARE_EXCLUSIVE | STGM_READ, STGFMT_ANY, 0, NULL, NULL, IID_IPropertySetStorage, reinterpret_cast<void**>(&pPropSetStg) ); if( FAILED(hr) ) return 0; hr = pPropSetStg->Open( FMTID_SummaryInformation, STGM_READ | STGM_SHARE_EXCLUSIVE, &pPropStg ); if( FAILED(hr) ) return 0; propspec.ulKind = PRSPEC_PROPID; propspec.propid = PIDSI_COMMENTS; hr = pPropStg->ReadMultiple( 1, &propspec, &propRead ); if( FAILED(hr) ) { pPropSetStg->Release(); pPropSetStg = NULL; return 0; } l = wcslen(propRead.pwszVal)+1; if(0 == len) { pPropSetStg->Release(); pPropSetStg = NULL; pPropStg->Release(); pPropStg = NULL; return l; } wcscpy(buf,propRead.pwszVal); pPropSetStg->Release(); pPropSetStg = NULL; pPropStg->Release(); pPropStg = NULL; return l; } int SetFileComments(wchar_t *filename, wchar_t *buf) { 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(filename, STGM_SHARE_EXCLUSIVE | STGM_READWRITE | STGM_DIRECT, STGFMT_ANY, 0, NULL, NULL, IID_IPropertySetStorage, reinterpret_cast<void**>(&pPropSetStg) ); if( FAILED(hr) ) return 0; hr = pPropSetStg->Create( FMTID_SummaryInformation, NULL, PROPSETFLAG_DEFAULT, STGM_READWRITE | STGM_SHARE_EXCLUSIVE, &pPropStg ); if( FAILED(hr) && STG_E_FILEALREADYEXISTS == hr) { hr = pPropSetStg->Open( FMTID_SummaryInformation, STGM_READWRITE | STGM_SHARE_EXCLUSIVE, &pPropStg ); if(FAILED(hr)) return 0; } propspec.ulKind = PRSPEC_PROPID; propspec.propid = PIDSI_COMMENTS; //specify the value of property propWrite.vt = VT_LPWSTR; propWrite.pwszVal = buf; hr = pPropStg->WriteMultiple( 1, &propspec, &propWrite,PID_FIRST_USABLE); if( FAILED(hr) ) { pPropSetStg->Release(); pPropSetStg = NULL; return 0; } pPropSetStg->Release(); pPropSetStg = NULL; pPropStg->Release(); pPropStg = NULL; return 1; }