掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Jpeg画像ファイルプロパティの編集 (ID:63931)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
試してみたところ、確かに失敗してしまいました。 > http://msdn2.microsoft.com/en-us/library/aa380387.aspx > に 掲載されているのは > 上記3つに該当していないのを使っているようです。 それは関係ありません。 そのサンプルでは、独自のプロパティセットを作って、その値を読み書きしています。 そのため、FMTID も独自のものを使っているのです。 結論から言うと、FMTID は SummaryInformation で合っています。 以下のコードでうまくいくかどうか試してみてください。 StgOpenStorageEx ではなく、CoCreateInstance を使っているのは、Windows XP から新たに採用された、SystemFileAssociations という関連付けの仕組みに、StgOpenStorageEx が対応していないためです。 そのため、StgOpenStorageEx が内部でやっているようなことを、手動でやっています。 以下の {eb9b1153-3b57-4e68-959a-a3266bc3d7fe} という CLSID はどこから出てきたかというと… レジストリエディタで、HKEY_CLASSES_ROOT\.jpg を探します。 ここに、PerceivedType = image という値があるので、 HKEY_CLASSES_ROOT\SystemFileAssociations\image を見ます。 このファイルのための IPropertySetStorage を実装している DLL を探すため、その下の shellex\PropertyHandler を見ると、CLSID がわかります。 なお、実際の DLL は、 HKEY_CLASSES_ROOT\CLSID\{eb9b1153-3b57-4e68-959a-a3266bc3d7fe}\InProcServer32 の下に書かれている、shimgvw.dll でした。 もし、上記の手順をやってみて、DLL が見つからなかったら、また相談してください。 #include <windows.h> #include <stdio.h> #include <locale.h> int _tmain() { setlocale( LC_ALL, "japanese" ); static DWORD const stgm = STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_DIRECT; HRESULT hr = CoInitialize( NULL ); IPropertySetStorage * ppss = NULL; CLSID clsid = CLSID_NULL; hr = CLSIDFromString( L"{eb9b1153-3b57-4e68-959a-a3266bc3d7fe}", &clsid ); IPersistFile * ppf = NULL; hr = CoCreateInstance( clsid, NULL, CLSCTX_INPROC_SERVER, IID_IPersistFile, reinterpret_cast< void ** >( &ppf ) ); if( SUCCEEDED( hr ) ) { hr = ppf->Load( L"C:\\p01.jpg", stgm ); if( SUCCEEDED( hr ) ) { hr = ppf->QueryInterface( IID_IPropertySetStorage, reinterpret_cast< void ** >( &ppss ) ); if( SUCCEEDED( hr ) ) { IPropertyStorage * pps = NULL; hr = ppss->Open( FMTID_SummaryInformation, stgm, &pps ); if( SUCCEEDED( hr ) ) { PROPSPEC ps; ps.ulKind = PRSPEC_PROPID; ps.propid = PIDSI_COMMENTS; PROPVARIANT pv; PropVariantInit( &pv ); hr = pps->ReadMultiple( 1, &ps, &pv ); if( SUCCEEDED( hr ) ) { switch( pv.vt ) { case VT_LPSTR: printf( "%s\n", pv.pszVal ); break; case VT_LPWSTR: wprintf( L"%s\n", pv.pwszVal ); break; default: printf( "Other Type : %d\n", pv.vt ); break; } PropVariantClear( &pv ); } pps->Release(); } ppss->Release(); } } ppf->Release(); } CoUninitialize(); return 0; }
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.