問題タブ [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.
delphi - Delphi、olevariantsおよび文字列の配列
(単純なバージョン)で作成されたoleオブジェクトがあります
これはすべて機能しますが、res変数には関数String [] GetAns() があり、このように呼び出します。
これも機能します。ただし、配列が返されない場合があり、例外がスローされます。
一時的な解決策として、私はそれをブロック以外の空の試行でラップしましたが、これは悪いことです。VarIsArray(Res.GetAns)を試し まし たが、結果がnullの場合でも機能しません
正しい結果を確認する正しい方法は何ですか?
ps私はoleオブジェクトを制御できません
c# - COM を介して C++ から C# にオブジェクトを渡す
こんにちは、次のような C# の COM 可視 API があります。
アイデアは、文字列パラメーターの値に基づいて、3 番目のパラメーターとして別のクラスを期待し、実装で適切にキャストすることです (この設計が最適ではないことはわかっていますが、ここではあまり柔軟性がありません)。
文字列パラメーターのいくつかの組み合わせについて、追加パラメーターの型が次のようになっているとします。
アンマネージ コードから API メソッドを呼び出す必要があります。ただしvariant
、3 番目のパラメーターに必要な適切な a を作成するのに問題があります。
作成したばかりの TestObject を指すCComVariant(...)
パスを使用しています。IDispatch
pTestObject
それが私の TestObject への IDispatch ポインターであると仮定すると、次のようなものがあります。
しかし、最終的に C# 関数が呼び出されると、オブジェクトの型が予期していたbool
型とは異なることがわかります。TestObject
何か案が?
ステファノ
c# - バリアントの欠落を処理する方法
私はC#の世界では初めてです。C ++で記述されたCOMサーバーがあり、状況によっては、variant_t :: missing()が返されます。C#でその値を受け取ろうとすると:
C#でイベントハンドルを実行できないという例外がスローされます。
どうすればいいですか?
c++ - boost::variant のビジター テンプレート
をテンプレート 'Visitor' クラスのパラメーターとして使用したいと思いboost.variant<T0,T1,T2>
ます。このクラスは、boost.variant ビジター メカニズムで必要なビジター オペレーターを提供します。この場合、すべて void を返します。
テンプレートには、バリアント内の各タイプ T0... に対して、デフォルトでは何もしない対応する仮想関数もあります。ユーザーはテンプレート クラスから継承し、関心のある仮想関数のみを再定義できます。これは、よく知られている「テンプレート メソッド」パターンに似たものです。私が思いついた唯一の解決策は、boost::variant と関連するビジターの両方を 1 つのテンプレートにラップし、typedef を介してそれらにアクセスすることです。これは問題なく動作しますが、少しぎこちなく感じます。コードは次のとおりです。
クラスは次のように使用されます。
私が言うように、これは問題なく動作するようですが、バリアントとビジターを結びつける特別なラッパー クラスを作成する必要がなければ、それを好むでしょう。テンプレートのビジター クラスをインスタンス化するために直接 boost.variant を使用できるようにしたいと考えています。型パラメーター、非型パラメーター、およびテンプレート テンプレート パラメーターの使用について調べましたが、何も示唆していないようです。私がやろうとしていることは不可能ですか?私は何かが欠けているかもしれません。誰かがこれについて意見を持っていれば幸いです。
c++ - マップを使用して COM VARIANT 型を実際の型にマッピングする
クライアントからさまざまな型の値を送信する COM オブジェクトの COM ラッパーを作成しており、Map 内のこれらの型を実際の C++ 型 (VT_BSTR から wstring など) にマップしたいと考えています。
すべての COM Variant 型の列挙を定義し、マップを使用してその列挙型をキーとして、取得した値を含む実際の型を使用することを考えていましたが、グローバル型が見つからないように見えるという問題に直面していますマップに配置するために渡された文字列または double などにキャストできるマップに配置します。
おそらく、これを行う方法についての私の考えは完全に間違っています。アドバイスをお願いします。
私は void ポインターを考えていましたが、コンパイラーは私のキャストを好まないようです:
(例)
このマップを反復するには、適切なタイプを見つけるために内部に switch ステートメントが必要になる可能性があります。より良い方法があるかどうかはわかりません。
arrays - Delphiでバリアント配列を使用する方法
2つのDelphi7プログラムがあります。COM自動化サーバー(EXE)と、自動化サーバーを使用しているもう1つのプログラムです。
あるプログラムから別のプログラムにバイトの配列を渡す必要があります。
いくつか検索した結果、バリアント配列を使用するのが最善の方法であることがわかりました(より良い方法を知っている場合は訂正してください)。
私の質問は、一方のプログラムでバリアント配列を作成し、もう一方のプログラムでその値を読み取るにはどうすればよいですか?
VarArrayCreateとVarArrayLowBound/VarArrayHighBoundについては知っていますが、これを正しく行う方法がわかりません。
ありがとう!
delphi - このバリアントメモリリークを停止するにはどうすればよいですか?
作成者によってサポートされなくなった古いスクリプトエンジンを使用していて、メモリリークに問題があります。ASMで記述された関数を使用して、スクリプトからDelphi関数を呼び出し、結果を整数として返し、その整数を型なしパラメーターとして別のプロシージャに渡し、正しい型に変換します。
これはほとんどの場合正常に機能しますが、Delphi関数の戻り型がVariantの場合、Variantが破棄されないため、メモリリークが発生します。バリアントを含む型指定されていないパラメーターを取得して、適切に破棄されるようにする方法を知っている人はいますか?これには、おそらくインラインアセンブリが含まれます。
編集:コメントでロブケネディの質問に答える:
AnsiString変換は次のように機能します。
これは正常に機能し、メモリリークは発生しません。入力パラメータとしてバリアントを使用して同じことをNull
実行し、2番目の手順で元のパラメータを割り当てようとすると、メモリリークが発生します。
バリアントには主に文字列が含まれており(問題のスクリプトはXMLを生成するために使用されます)、このスクリプトが呼び出しているDelphi関数のバリアントにDelphi文字列を割り当てることでそこに到達します。(この場合、関数の戻り型を変更しても機能しません。)
parameters - バリアント レコード関数のパラメーターを適切にキャストする方法に関する昔ながらの Pascal の質問
インラインキャストまたは割り当てを可能にするバリアントレコードタイプパラメーターを使用して関数を作成しようとしています。
さて、変数を手動で設定するのに時間がかかる限り、上記の「動作」はうまくいきます。
しかし、私は型付けシステムを少し乱用して、次の行に沿ってインラインで実行しようと思います (理由はすぐに説明します)。
ヘルパー関数も同様に問題なく、これを行うためにいくつかの異なる方法を試しました。
http://pastie.org/private/glxhwbpsbbh5gtxju0uvxa
今、理由があります: 私は取り組んでおり、実際に、Pascal 自体と同じくらい移植可能であることを目指している単体テスト スイートをリリースしました (FreePascal および Turbo Pascal 7 でビルドされます (そうです))。私はすでにオープンソース ソフトウェアを公開しています (まだリンクできず、十分な担当者がいません)。これには、さまざまなタイプのさまざまな関数が含まれています: isI()、isR()、isS()、isP()、isC()など。これは多くのコードを繰り返しますが、これを行うためのより良い方法があることを知っています。FPC と Delphi でサポートされているバリアント型があり、これらのプラットフォームで IFDEF ディレクティブを介して使用できると思いますが、本当の決め手は TP7 です。
レコードを設定するために関数呼び出しごとに 4 行が実際に実行可能ではない理由は、これがユーザー向けの API であり、複雑なテストを行うことは、誰もそれを実行しないことを意味するからです。現在の API を使用したテスト セットは、各テストを実行するための 1 つの関数呼び出しで簡単です。いくつかの型固有の関数すべてを次のようなものに変換できることを願っています。
アセンブリで自分でスタックを操作するなど、TP7 での入力を回避するために、あらゆる手段を講じるつもりです。
それで、昔ながらの Pascal プログラマー (そこに何人かいるに違いないことは知っています)、何か提案はありますか?
c++ - boost :: any、バリアント、それらの配列に基づく関数の呼び出し
次のような一連の関数が与えられます。
これは、クロススレッドのイベントと通信に関する私の実験に関係しているため、不必要に難解に見えるかもしれません。
編集:わかりました、たとえば、これは意図です。明らかにコンパイルされません(テンプレートの解決はコンパイル時に行われますが、実行時に呼び出す関数を決定したいです!):
c++ - C++ブーストバリアントの質問
私はそれがその背後にあるものをboost::variant
使用しboost::mpl
、mpl互換のtypedefを持っていることを知っていますtypes
。
単純なtypedefがあるとしましょう:typedef boost::variant<bool, int> Variant;
今、私は別のテンプレート関数を持っています、例えば:
T
この関数は、一部の場合とそうでない場合の2つの場合で異なる動作をするようにしVariant::types
ます。
明らかに、私は次のようなことをしなければなりません
私が知らない唯一のことはこれCONDITION
です。
T
さて、がの一部である場合、コンパイル時のクエリを作成することは可能だと思いますVariant::types
。
誰かが方法を知っていますか?