COMについて ― 2010/08/15 09:07

雲は、最近、Windows Imaging Component にはまってます。何故かと言えば、画像ファイルを読み書きするライブラリにこれまで、GDI+を使ってきたのですが、GIF の書き出しがどうしてもうまくいかないことと、WPFと同じライブラリを使いたいということで、乗り換えを進めています。
いや、でも、WIC はCOMで出来ているので結構大変です。雲は、昔からプログラムを書いてはきましたが難しいことには近寄らないようにしていました。特に、MFCに代表されるWindowsのプログラミングからは距離を置いていたのが逆手に出てしまっています。
WIC を使おうと思って既に2年くらい経っていますが、何とか、使い方まではたどり着きました。いろいろと、Webで情報収集を済ませようと思っていましたが、結局、Inside COM を読む羽目になっています。
が、やはり、書籍はわかりやすい。確かに金額は高いのかもしれませんが、その分、時間を短縮出来ているように思います。
出版社の皆さん。高くても良いので、時間を短縮できるような良い書籍を出版してください。COMの本なんか、プレミアム付きになっていて泣きそうです(しかも古いし。。。)。
Web は便利ですが、決して、無料ではありません。最も大切な時間というリソースを無駄食いします。
ということで、COMを理解しようと頑張る雲でした。
COMを調べたメモ ― 2010/08/16 09:07

Windows Imaging Component を調べているときに、PROPBAG2 なる構造体に遭遇しました。で、この中をみていると、VARIANTがあったので、さらに調べてみると、
VARIANT型を知ってみる
http://marupeke296.com/IKDADV_CPP_VARIANT.html
に出会いました。で、何故か、
SAFEARRAYを試してみる
http://marupeke296.com/IKDADV_CPP_SAFEARRAY.html
Dr.GUI と COM オートメーション、第 3 部:続 COM のすばらしきデータ型 http://msdn.microsoft.com/ja-jp/library/cc482694.aspx
を見ていると、SAFEARRAYでEXcelを操作する。というものを見つけました(←まさに、芋づる)。
範囲指定したCellのデータを取得
http://www.ujasiri.com/prglib/vc/excel/xls_getarray_exp.html
SAFEARRAYのMFCのラッパが(COleSafeArray)らしく、COleSafeArrayで検索するといろいろ出てきます。
メモリ管理クラス(HeapAllocなどをCOMでラップしたクラスあり)
http://msdn.microsoft.com/ja-jp/library/44yh1z4f.aspx
COM のエラーコード (HRESULT)
http://hyons.hp.infoseek.co.jp/ref/hresult.shtml
COM の使い方(MSDN)
VARIANT(何でも入れられる魔法の変数?) ― 2010/08/16 17:17

COM で使われる構造体である、VARIANT を利用して Windows Imaging Component では画像の圧縮方法を指定します。ただ、VARIANT 自体は、WIC固有の構造体ではなく、COM で一般的に利用される構造体のようです。そこで、少し、VARIANT について調べたことを忘れないように書いておきます。
_variant_t を使用して、楽して安全にデータ変換
http://isobe.exblog.jp/2060639/
VARIANT型を知ってみる
http://marupeke296.com/IKDADV_CPP_VARIANT.html
Variant Manipulation Functions [Automation]
http://msdn.microsoft.com/en-us/library/ms221673.aspx
CComVariant クラス(VARIANTのスマートポインタ (ATL))
http://msdn.microsoft.com/en-us/library/bc1kbba1(VS.80).aspx
_variant_t を使用して、楽して安全にデータ変換(VARIANT型のスマートポインタ。ATLではなくこちらを採用)
http://isobe.exblog.jp/2060639/
_variant_t Class(MSDN)
http://msdn.microsoft.com/ja-jp/library/x295h94e(v=VS.80).aspx
_variant_t に入っている型の調べ方
http://hp.vector.co.jp/authors/VA014436/prg_memo/database/ms/009.html
SAFEARRAY(COMの配列) ― 2010/08/16 18:05

_variant_tに配列を入れるときには、SAFEARRAYなるものを使うようです。なので、SAFEARRAYについても忘れないようにメモを残しておきます。
CComSafeArray クラス(SAFEARRAYのスマートポインタ ATL)
http://msdn.microsoft.com/ja-jp/library/3xzbsee8(v=VS.80).aspx
SAFEARRAYを試してみる
_variant_tのchar, wchar への変換 ― 2010/08/16 19:33

_variant_t に文字列が含まれているときに、その文字列を取得する方法です。
wchar_t へ変換
_variant_t v( L"あいうえお" ); wchar_t str[20]; wcscpy_s( str, (_bstr_t)v );
char へ変換
_variant_t v( L"あいうえお" ); char str[20]; strcpy_s( str, (_bstr_t)v );
variant型のデータについてキャストするには?
http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200606/06060025.txt
さまざまな文字列型間で変換する
https://docs.microsoft.com/ja-jp/cpp/text/how-to-convert-between-various-string-types?view=msvc-170
最近のコメント