お世話になります。舘石です。

>>STDMETHODIMP CTestObj1::GetStatus(VARIANT* p1, VARIANT* p2, VARIANT* p3)
>>{
> 
>  	*p1 = _variant_t("aaa").Detach();

> 
> とDetach()を使うとどうでしょうか。
> 

ああ、こうやってやるんですね。やっとわかりました。ありがとうございます。

以前のだと、_variant_tが消えるときに、VariantClearが呼び出されて、
BSTRもSysFreeStringされてしまっていた。
Detachして、VariantClearは呼び出し元にまかせなきゃダメですよね。
もっと勉強しないと(汗)

> 
>>STDMETHODIMP CTestObj1::GetStatus(VARIANT* p1, VARIANT* p2, VARIANT* p3)
>>{
>>	_variant_t v1("aaa");
>>	_variant_t v2("bbb");
>>	_variant_t v3("ccc");
>>
>>	*p1 = v1;
>>	*p2 = v2;
>>	*p3 = v3;
>>
>>	return S_OK;
>>}
>>
> こっちもいささかあやしい気がします。
> 

でも、なぜこっちはちゃんと動くのか不思議です。
呼び出し元がVARIANTを見たときには、すでに
解放されているはずですよね?

ふと気づけば、話がぜんぜんRubyじゃなくなってます。。。
失礼しました。