COM

VARIANT型に値セットするならV_*マクロを使おう

COM

OleAuto.hに定義がある VARIANT variant; VARIANT *pV = &variant; V_VT(pV) = VT_I4; V_I4(pV) = 100;って感じ。直接メンバ変数に設定するよりわかり易くなる。 VT_I4のときはどのメンバに設定するかすぐわかんないでしょ?ネタ元 http://stackoverflow.com…

VARIANT 型を受け取る際の注意

COM

VARIANT 型を受け取る際の注意VARIANTをただ便利な型だと思って使ってると痛い目を見る。 かなりデリケートに扱わないと、いつのまにかメモリリークってことになるので注意。

VARIANT型でBSTRを使った時にはVariantClear()

COM

確保したリソースを解放し、VT_EMPTY を設定し、初期化します。 ネタ元 VARIANT型について Part.3 【Visual C++】

OLE2Tマクロはむやみに使うの禁止

COM

OLE2T が実行されるたびに、スタック領域が消費されるのでループ内での使用や、非常に大きな文字列の使用は避けなければなりません。 ヒープに変換して使うなら、こう。 #include <memory> std::unique_ptr<TCHAR[]> p_json(new TCHAR[json.length()]); long len = mbstowcs( </tchar[]></memory>…

C++でVARIANT型使う時はVariantInit()忘れさんな

COM

初期化忘れると一見動いてるようでもバグってますよ。 VARIANT ret; VariantInit(&ret); ret = Hoge();ネタ元 http://marupeke296.com/IKDADV_CPP_VARIANT.html

VARIANT and VARIANTARGで、型の指定と値をどのメンバに値を入れればいいのか情報

COM

書きなぐりメモ intの配列をSAFEARRAYで渡す場合は Cpp COleSafeArray arg; ... pVarg[0].vt = VT_ARRAY | VT_I4; pVarg[0].parray = arg.parray; C# public bool func00(int[] p_candle){ .... return true } ネタ元 VARIANT and VARIANTARG http://www.mat…

マーシャリングとは非.NETのデータ構造を.NETのオブジェクトに変換すること(もしくはその逆)

COM

マーシャリングは…非.NETのデータ構造を.NETのオブジェクトに変換すること(もしくはその逆)です。 .NETの全てのオブジェクトはガーベージコレクタによりメモリ管理されています。そのため、.NETのオブジェクトのことをマネージドオブジェクト、そこで使わ…

CStringからBSTRを作るにはAllocSysString()/SetSysString()を使う

Microsoft Foundation Class(MFC)には BSTR をラップするヘルパー クラスがありません。代わりに、別の方法で BSTR と MFC の CString クラス間の変換が簡単に行えます。次のように BSTR を CString コンストラクタに渡すだけで BSTR を CString に変換で…

BSTR使うなら_bstr_t が便利

COM

[COM]_bstr_t はBSTR型のラップするスマートポインタみたいなクラスらしい。スコープ抜けるとSysFreeString()コールしてくれるみたいなので、自分で解放しなくてもいいらしい。中のBSTRにアクセスするときはGetBSTR()でいける。ネタ元 _bstr_t は何気に便利…

C++からVB.NET DLLの関数にDate型で値を渡すならCOleDateTimeを使う

[VC][VB][COM]どうも内部はdoubleの値となっているようで、それを渡せればOKみたい。 #include "ATLComTime.h" … DISPPARAMS params; ::memset(&params, 0, sizeof(DISPPARAMS)); params.cNamedArgs = 0; params.rgdispidNamedArgs = NULL; params.cArgs = 1…

BSTRからC文字列への変換

// BSTR to C String BSTR bstrStart; bstrStart = GetBSTR(); TCHAR szFinal[255]; // direct conversion from BSTR to LPCTSTR only works // in Unicode _stprintf(szFinal, _T("%s"), (LPCTSTR)bstrStart); AfxMessageBox(szFinal); _bstr_t bstrInterme…