0

次のコードは MSDN のソース コード例からのものですが、1 つ質問があります。

VARIANT result;異なる変数を定義するために複数の定義を使用する必要があるのはなぜですか? VARIANTより短い方法で異なる型 (主に整数と文字列) の変数を初期化できますか? 簡潔で安全な方法。

また、単に空としてマークするためVariantInit(&result)に置き換えることができますか?result.vt = VT_EMPTYVARIANT

int main()
{
    //blahblahbla
    {
        VARIANT x;
        x.vt = VT_R4;   // 4-byte real. 
        x.fltVal = 1.2f;
        wprintf(L"Set FloatProperty = %.2f\n", x.fltVal);
        hr = AutoWrap(DISPATCH_PROPERTYPUT, NULL, pSimpleObj, L"FloatProperty", 1, x);
    }
    {
        VARIANT result;
        VariantInit(&result);
        hr = AutoWrap(DISPATCH_PROPERTYGET, &result, pSimpleObj, L"FloatProperty", 0);
        wprintf(L"Get FloatProperty = %.2f\n", result.fltVal);
    }

    {
        VARIANT result;
        VariantInit(&result);
        hr = AutoWrap(DISPATCH_METHOD, &result, pSimpleObj, L"HelloWorld", 0);
        wprintf(L"Call HelloWorld => %s\n", result.bstrVal);
        VariantClear(&result);
    }
}
4

2 に答える 2

2

異なる "VARIANT 結果" 変数を使用する必要があるのはなぜですか?

必要はありません。これは、サンプルが記述された方法です。VARIANT 変数を再利用するときは注意してください。単に VariantInit() を呼び出したり、result.vt = VT_EMPTY を割り当てたりするのは危険です。バリアントは、解放する必要があるリソースを格納できます。スニペットで行ったように、BSTR を解放するために必要な VariantClear() の呼び出しに注意してください。VariantInit() とは異なり、VariantClear は最初にリソースを解放してからバリアントを再度初期化します。

また、DISPATCH_PROPERTYGET 呼び出しの後にどのように省略されたかにも注意してください。それは大丈夫ですが、自分が何をしているのかを知る必要があります。この場合、VARIANT はメモリを割り当てなくても浮動小数点値を格納できるため、問題ありません。とにかく VariantClear() を呼び出すことは間違いありません。

MSDN のソース コードは、多くの場合、C コンパイラでコンパイルするように記述されていることに注意してください。COM コードを作成する場合は、ほとんどの場合 C++ を使用することを好みます。_variant_t クラスを使用できるようになりました。ばかげた間違いを回避し、構文をよりクリーンにするラッパークラス、あなたが求めていたもの。VariantInit または VariantClear を使用する必要はなくなりました。ラッパーがそれを行い、間違いを犯すことはありません。

于 2013-10-11T20:58:41.640 に答える
0

直接使用VARIANTする代わりに、C++ で使用可能なラッパー クラスの 1 つを使用することもできます。MFC または ATL を使用しているか、ネイティブ C++ のみを使用しているかに応じて、いくつかの代替手段があります。

単純なラッパーには、_variant_t特に整数や文字列などの単純なデータに対していくつかの基本的な機能を提供するクラスがあります。SAFEARRAYこのクラスはtypeを直接サポートしていませんVARIANTS

ラッパー クラスと利用可能なメソッドの概要を提供するMicrosoft Developer Network トピック _variant_t クラスを参照してください。

オブジェクトはデータ型_variant_tをカプセル化します。VARIANTこのクラスは、リソースの割り当てと割り当て解除を管理し、必要に応じて および への関数呼び出しをVariantInit行いVariantClearます。

さまざまなパラメーターの型を取り、適切な種類のVARIANTオブジェクトを作成するコンストラクターにはいくつかのバリエーションがあります。標準の Windows API UNICODE またはwchar_t文字列のように見えますが、オブジェクトを使用する必要がありBSTRます。

ATL は を提供しCComVariant、MFC はCOleVariantラッピング用のクラスを提供しますVARIANT。これらの 3 つのラッパー クラス ( _variant_tCComVariantおよびすべては、 の基礎となるデータ構造COleVariantから派生しているように見えるため、これらはすべて、 を使用する任意のインターフェイスで使用できるようです。struct tagVARIANTVARIANTVARIANT

Microsoft Developer Network CComVariant クラスCComVariantからのこのメモ

CComVariant は、ユニオンと、ユニオンに格納されているデータの型を示すメンバーで構成される VARIANT および VARIANTARG 型をラップします。VARIANT は通常、オートメーションで使用されます。

CComVariant は VARIANT 型から派生するため、VARIANT を使用できる場所であればどこでも使用できます。たとえば、V_VT マクロを使用して CComVariant の型を抽出したり、VARIANT と同じように vt メンバーに直接アクセスしたりできます。

そして、 Microsoft Developer Network COleVariant ClassCOleVariantからのこのメモ:

このクラスは VARIANT 構造から派生しています。これは、VARIANT を呼び出すパラメーターで COleVariant を渡すことができ、VARIANT 構造体のデータ メンバーが COleVariant のアクセス可能なデータ メンバーであることを意味します。

于 2016-09-05T22:18:56.897 に答える