<propvarutil.h>
のVariantToString
関数は新しく割り当てたメモリを返しますが、そのメモリを解放すべきかどうかの記載が一切ありません。CoGetMalloc
で取得したIMalloc
のGetSize
は正しい値を返すので、おそらくCoTaskMemFree
関数で解放すればよいのではないかと想像します。
なお、PropVariantToStringAlloc関数はCoTaskMemFree
関数が必要であると明記されています。
#pragma comment(lib, "propsys.lib") #define STRICT #include <Windows.h> #include <propvarutil.h> #include <ShlObj.h> int main() { VARIANT var1; HRESULT hr = InitVariantFromString(L"TEST", &var1); LPWSTR psz = nullptr; hr = VariantToStringAlloc(var1, &psz); IMalloc* pMalloc; hr = CoGetMalloc(1, &pMalloc); size_t size = pMalloc->GetSize(psz); // 10 CoTaskMemFree(psz); // メモリ解放後に繰り返してもエラーは発生しない。 hr = VariantToStringAlloc(var1, &psz); size = pMalloc->GetSize(psz); // 10 CoTaskMemFree(psz); pMalloc->Release(); return 0; }
文字列に強制変換する必要がなければ、VARIANT
内部の文字列アドレスを返すVariantToStringWithDefault
関数やVariantGetStringElem
関数を使うのもありかなと思います。