問題タブ [variant]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
544 参照

com - COM-visible関数(VB6)の複合オブジェクトのパラメータータイプ

またはを使用する必要がありますobjectvariant?どんな違いがあるの?

0 投票する
4 に答える
1879 参照

c# - CLR/Managed C++ でバリアント型を実装するにはどうすればよいですか?

.net CLR オブジェクトはすべてのクラス オブジェクトのベースですが、基本型 (int、float など) ではありません。Object のような基本型を使用するにはどうすればよいですか? すなわちBoost.Variant のような?

: -

0 投票する
1 に答える
3763 参照

delphi - Delphi:VarIsBoolean()-関数はありませんか?

Variants.pasには、バリアントの型をチェックするためのいくつかのVarIsXXX()関数があります。ただし、VarIsBoolean()はありません。

バリアントがブール型であるかどうかを確認するための好ましい方法は何ですか?

0 投票する
2 に答える
4101 参照

c# - 無効なバリアントのクラッシュ

最終的に C# で使用するために、ネイティブ C++ DLL を C++/CLI でラップした状況があります。

実行時にいくつかの問題を引き起こしているコールバック関数がいくつかあります。特に、次の例外が発生します。

タイプ 'System.Runtime.InteropServices.InvalidOleVariantTypeException' の未処理の例外が ToadWrapTest.dll で発生しました

追加情報: 指定された OLE バリアントは無効です。

このコード行 (C++/CLI):

この「中間コールバック」を作成した理由は、デリゲートを C# からネイティブ C++ コードに直接マップしようとしたときにスローされる無効なバリアント例外を回避する試みでした。回避策として、C# 側でデリゲートを宣言し、その funcptr を C++/CLI ラッパーに渡します。次に、中間の funcptr をネイティブ C++ に渡し、呼び出しをデイジー チェーン接続します。

私が知っているのは、それがすべてネイティブ C++ の世界で機能するということです。問題は、void* を管理対象の世界にマッピングすることです。次のコードは、コールバックのネイティブ C++ バージョンを示しています。

誰かがここで助けてくれれば、本当に感謝しています。

0 投票する
2 に答える
1335 参照

c# - C#.NETでオブジェクト[]を返すC++のCOMオブジェクトを使用する

C ++(.NETではない)から使用しようとしているCOMオブジェクトがあり、すべてのサンプルプログラムとマニュアルは、C#.NETまたはVB.NETの使用を想定して作成されています。COMは私にとって新しいので、私は少し圧倒されています。TLBで#importを使用していますが、パラメーターとして使用されるバリアントを処理するのに苦労しています。私は1つの特定のメソッドを持っています。それは、C#.NETのドキュメントとサンプルプログラムによると、object[]を返すことになっています。次に、この配列の最初のエントリをControlEventにキャストし、配列内の残りのオブジェクトをどう処理するかを指示します。C#.NETの例は次のようになります。

私の場合、GetEventは私に_variant_tを返します。さらに処理できるように、これをobject[]に変換する方法を知る必要があります。C++で「オブジェクト」をどのように表現するかさえ私にはわかりません。_variant_tのドキュメントには、バリアントを変換できるものが何百万も示されていますが、使用できるものに変換されているものはないようです。上記のC#.NETコードをVisualC++に変換するための支援を期待しています

ありがとう。

0 投票する
2 に答える
2493 参照

delphi - バリアントVarArrayを解放します

Win32用のDelphiを使用しています。

この関数はメモリリークを引き起こしますか?

バリアントvをvararrayとして解放する必要がありますか?

ローカルバリアントvを解放または初期化する必要がありますか?

0 投票する
1 に答える
1722 参照

.net - COMで使用するためのpropputIDLメソッド.NETインターフェイスを作成する方法

Excel/VBAで.NET/ComVisibleアセンブリを使用すると問題が発生します。.NETでいくつかのパラメーターを「オブジェクト」として定義したので、VBAのオプションのパラメーターはVariantタイプを使用する必要があるため、それらはVBAのVariantに変換されます。

問題は、Excel / VBAでオブジェクトを使用しようとすると、「実行時エラー '424':オブジェクトが必要です」というメッセージが表示されることです。バリアントの値を許可する「 propputref」メソッドの代わりに「propput 」メソッドを追加するC#インターフェイスの属性が欠落していると思いますが、インターネット上で同様の質問に対する回答は見つかりませんでした。System.Reflection.BindingFlagsが表示されますが、これはコンパイル時とランタイムコードでのみ機能し、インターフェイス定義では機能しないようです。

基になるデータ型はdoubleであり、COM/VBAを介してnullまたはdoubleにする必要があります。文字列パラメータに問題はなく、variant/doubleだけです。

C#インターフェイスは次のとおりです。

C#オブジェクトは次のとおりです。

VBAの使用法は次のとおりです。

OleViewのタイプライブラリIDLは次のとおりです。

唯一の解決策は、IDLを手動で生成し、VB6でVB.NETを使用して、このスレッドのように.NETにインポートして戻すことです。それが唯一の解決策ですか?マネージコードでCOMを使用するための基本事項に関するこの記事も非常に優れていましたが、.NET / C#でのインターフェイスの定義については説明していませんでした。

0 投票する
1 に答える
3062 参照

c# - COM 呼び出し用に .NET 文字列をバリアントにマーシャリングする方法

C# からサードパーティの COM ライブラリを使用しています。

VARIANT 型 (VT_BSTR 型) のパラメーターを受け取る get/set メソッドがあります。.NET ラッパーでは、これらのパラメーターは type として表示されますobject

getValue メソッドは問題なく動作します。オブジェクトを文字列型に単純にキャストします。

しかし、同様の方法で文字列を設定しても、次のことはできません。

サードパーティのライブラリはこれを好まず、例外を生成します。VT_BSTR 型の VARIANT を想定している必要があります (これはネイティブ C++ から機能するため)。私の質問は、C# でこれらのいずれかを作成するにはどうすればよいですか?

私は のようなメソッドを見てきましたがMarshal.GetNativeVariantForObject、これの正しい使用法に関するドキュメントは地上では少し薄いように見えるので、サンプルコードは役に立ちます.

0 投票する
1 に答える
1326 参照

c# - Variant 値の周りにタイプ セーフなラッパーを作成する方法

System.Runtime.InteropServices.VarEnumで説明されているバリアント型としてデータ タグを格納するOPC サーバーコントロールを使用しています。これらの型には、VT_BSTR (文字列)、VT_I2 (短)、および VT_I4 (長) が含まれます。

これらの値はすべてサーバーによってオブジェクトとして保存されるため、フェッチするときに正しい値にキャストする必要があります。

私は次のようなことができることを知っています:

TypedVariant は、次のようなジェネリック クラスです。

しかし、実行時にすべてを実行できる方法はありますか。つまり、次のようなものです。

明らかに、このコードはコンパイルされませんが、このように実行できますか?

更新: @Konamiman からの提案に従って、暗黙のキャストを許可するようにクラスを変更しました。したがって、このコードを記述できるようになり、すべてタイプセーフであるため、作成されたものとは異なるタイプでバリアントを格納することはできません。