問題タブ [safearray]
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.
variant - EuCOM を使用して Euphoria で BSTR のバリアント配列を作成するにはどうすればよいですか?
これまでのところ、Typelib を使用して Euphoria DLL との間で Unicode 文字列 (bSTR) を渡す方法を理解しました。これまでのところ、BSTR の配列を作成して返す方法がわかりません。
私がこれまでに持っているコード ( include
EuCOM 自体と Win32lib の一部の s とともに):
タイプライブラリの一部は次のとおりです。
VB6 のテスト コードは次のとおりです。
これまでに取得できたのは、DLL からのエラー「0」だけです。何か案は?誰?
com - CComSafeArray を SAFEARRAY を期待するメソッドに渡すときの正しい構文は何ですか **
これにはおそらく非常に単純な答えがありますが、私にはわかりません。
次のようなコードをリファクタリングしようとしています。
コードを次のように変更したいと思います。
しかし、これを実行すると、sa にゴミが含まれます。何が起きているのか、その理由は? 正しい構文は何ですか?
c# - SafeArrayGetElementを使用してVT_UNKNOWNのSafeArrayに適切にアクセスする
実装とインターフェイス定義がマネージコードに存在するが、ネイティブコンポーネントによって駆動されるCOMコンポーネントがあります。管理対象コンポーネントはSafeArray
、次のメソッド宣言を介してネイティブコードに戻ります。
生成されたネイティブ署名は、これを。として適切に返しますSafeArray
。
コードレビュー中に、SafeArrayGetElementを使用した結果の配列の呼び出しに関するいくつかの質問がありました。IUnknown
問題は、SafeArrayGetElementがAddRefされたインスタンスを返すかどうかです。基本的に、次のうちどれが正しいかを要約します。
例1:
例2:
このテーマに関するドキュメントは非常に薄いです。次の行のみが含まれます。
データ要素が文字列、オブジェクト、またはバリアントの場合、関数は要素を正しい方法でコピーします。
正しいの定義は少しあいまいです。
.net - COM メソッドを介して .NET オブジェクトの配列を返す方法
.NET アセンブリがあります。たまたま C++/CLI で書かれています。COM 経由でいくつかのオブジェクトを公開しています。すべてが正常に機能していますが、メソッドから自分のオブジェクトの配列を返す方法を一生理解できません。そうするたびに、実行時に型の不一致エラーが発生します。int または文字列の配列を問題なく返すことができます。
これが私のメインクラスです
これが私が返すクラスです
これは、それを呼び出す私の (ネイティブ) C++ コードです。
GetStuff() を呼び出すと、_com_error 0x80020005 (DISP_E_TYPEMISMATCH) が返されます。メソッドが正しく呼び出されていることはわかりますが、.NET/COM がリターンをマーシャリングしようとすると、チョークします。先ほど言ったように、int または文字列の配列で問題なく動作します。クラスが配列で返されるようにするには、クラスに何をする必要がありますか?
たまたま、私のクラスにはいくつかの文字列と int (メソッドなし) しか含まれていません。明らかに、実際にいくつかのデータを含む空でない配列とクラスを返そうとしましたが、これは問題を示す最も単純なケースです。
c++ - ローカルのCComSafeArrayをLPSAFEARRAY出力パラメーターに戻すにはどうすればよいですか?
LPSAFEARRAY*
outパラメータを介してSafeArrayを返すCOM関数があります。CComSafeArray
この関数は、ATLのテンプレートクラスを使用してSafeArrayを作成します。私の素朴な実装はCComSafeArray<T>::Detach()
、所有権をローカル変数から出力パラメーターに移動するために使用します。
問題は、SafeArrayの新しい所有者(この場合はmain)が破棄されたときに、ロックがゼロではなく、SafeArrayのロック解除に失敗するように操作をCComSafeArray::Detach()
実行することです(SafeArrayがないため、メモリリークが発生します)。割り当て解除)。Unlock
sa
Destroy
E_UNEXPECTED
COMメソッドの境界を介してCComSafeArrays間で所有権を譲渡する正しい方法は何ですか?
編集:これまでの単一の回答から、エラーはmain
サーバー側()ではなくクライアント側()にあるようですが、この些細なユースケース向けに設計されたものではないfoo
とは信じがたいです。 CComSafeArray
SafeArrayをCOMメソッドからに取得するためのエレガントな方法になりますCComSafeArray
。
c++ - VARIANT へのポインタの SAFEARRAY を構築する方法は?
次の方法で COM コンポーネントを使用しようとしています。
C/C++ で paramValues 配列を作成するにはどうすればよいですか?
c++ - Textfile を Safearray に読み込む
テキストファイルを読み取り、データを Safearray に保存する必要があります。
私はこの機能でそれを試しました:
問題は、ファイルのサイズが読み取りバイトよりも大きいことです...
なにが問題ですか?
よろしく
c# - UDT の SAFEARRAY を C# から unmaged コードに渡す方法
VT_RECORD も使用しました。しかし、UDT の safearray を渡すことに成功しませんでした。
最初のパラメーターを使用せずにアンマネージ コードと通信すると、「guids」パラメーターをアンマネージ コードに渡してもエラーは発生しません。
アンマネージ側で取得した SAFEARRAY の要素を GUID 型にキャストすることもできました。しかし、UDT クラス MY_CLASS を SAFEARRAY を使用してアンマネージ コードに渡そうとすると、マネージ コードで失敗します。(上記のコード スニペットのように)
「タイプ 'System.Runtime.InteropServices.SafeArrayTypeMismatchException' の未処理の例外が myapp.exe で発生しました」「追加情報: 指定された配列は予期されたタイプではありませんでした」という例外が表示されます。
このような状況で UDT の SAFEARRAY を unmaged コードに渡すのを手伝ってください。
com - 構造体の配列 (std:string または BSTR を含む) を ATL から C# に渡す方法を教えてください。セーフアレイ? 変異体?
C# から使用している ATL COM オブジェクトがあります。インターフェースは現在次のようになっています。
つまり、非常にシンプルなインターフェースです。また、送り返すイベントもいくつかあります。ここで、インターフェイスに何かを追加したいと思います。ATL には、現在構造体であり、次のように見えるいくつかの結果があります。文字列 ID; 文字列の要約; }; 構造体のすべてのメンバーは std::string です。C# に戻す必要があるこれらの配列があります。これを行う最善の方法は何ですか?
誰かがこう言うだろうと思います、「おい、std::string をそのように COM 経由で送信することはできない。もしそうなら、それでいいが、構造体を変更する最良の方法は何だ? std::string を BSTR に変更する?」 1) 構造体の配列 (BSTR または std::string を含む構造体) を渡すように IDL を設定します。2) SAFEARRAYS を使用する必要がある場合、SAFEARRAYS を構造体で埋める方法。
単純な型での使用を除いて、COM には詳しくありません。