問題タブ [com-interop]
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.
windows - QueryInterface() 実装で null ポインターをチェックする価値はありますか?
IUnknown::QueryInterface() には、取得したインターフェースを置くアドレスを示す void** パラメータが渡されます。
QueryInterface() の実装は、このポインターが null であることを確認する (そしてすぐに E_POINTER を返す) べきか、それとも単にそこに書き込むべきか?
COM 関連のコードをたくさん見てきましたが、ほとんどどこでもチェックが実行されていません。仮説的には、もちろん誰かがこのパラメーターとして null ポインターを渡すことができますが、そのようなチェックは本当に必要ですか?
windows - E_POINTERを返すときとE_INVALIDARGを返すとき?
COMインターフェイスメソッドはHRESULT
、渡された無効な引数値を通知するためにさまざまな値を返すことができます。E_POINTER
いつ戻るのE_INVALIDARG
ですか?
私が理解しているように、メソッドがカプセル化されたコレクションのインデックスを受け取り、それが範囲外であるかどうかE_INVALIDARG
。Interface**
メソッドが、新しく作成されたオブジェクトへのポインタを格納することを目的としたポインタを受け取った場合E_POINTER
。
WCHAR*
しかし、「in」パラメーターとしてファイル名を持つバッファーを受け取り、これWCHAR*
がnullの場合はどうなるでしょうか。これE_POINTER
ですかE_INVALIDARG
?
または、メソッドが構造体へのポインターを受け取り、そのポインターを介して構造体を埋めることが期待され、このポインターがnullである-これE_POINTER
またはE_INVALIDARG
?
いつ戻るかE_POINTER
、いつE_INVALIDARG
ポインタ型パラメータをチェックするかについての規則は何ですか?
.net - COMオブジェクトのタイプを取得する方法
Visual StudioでCOMライブラリを参照しているので、対応する相互運用機能アセンブリが自動的に作成されます。GetType()
これらのcomオブジェクトに対してを実行したいのですが、常に。を返しSystem.__ComObject
ます。ただし、インターフェイスのクエリは機能します。
しかし、私が本当に望んでいるのは、comオブジェクトの実際のタイプを返すことです。
誰かが私がやりたいことをする方法を知っていますか?
c# - ClassInterfaceType.None が必要ですか?
MSDN から次の情報を取得できませんでした:
ClassInterfaceType.None
クラスのクラス インターフェイスが生成されないことを示します。インターフェイスが明示的に実装されていない場合、クラスはインターフェイスを介したレイト バインド アクセスのみを提供でき
IDispatch
ます。の推奨設定ですClassInterfaceAttribute
。を使用するClassInterfaceType.None
ことは、クラスによって明示的に実装されたインターフェイスを介して機能を公開する唯一の方法です。[ComVisible(true)]
COM の可視性には必須ですか?
.net - SSIS フラット ファイル接続の列を一覧表示する
DB テーブルをフラット ファイルにエクスポートする SSIS パッケージから、列 'start/length' 仕様ドキュメントを作成しようとしています。Columns
フラット ファイル接続を処理する ConnectionManager オブジェクトからプロパティを取得する際に、レンガの壁のようなものにぶつかりました。プロパティを取得できColumns
ますが、キャスト先の型を特定できないため、何もできません。これを DTSProperty にキャストすると、オブジェクトの有用なプロパティはほとんど得られません。プロパティを として取得した場合object
、判断できるのは、それが であるということだけですSystem.__ComObject
。
Columns プロパティを便利なオブジェクト (できればコレクション) として取得して、繰り返し処理できるようにするにはどうすればよいですか?
サンプルコード:
windows - インプロセス コンポーネントを COM+ に配置することを禁止することはできますか?
ATL C++ インプロセス COM コンポーネントがあります。このコンポーネントは外部で使用するためのものではありません。アプリケーションで使用するためだけに必要です。
ときどき、ユーザーがそれを COM+ に入れると、あらゆる種類の奇妙なエラー (「アクセスが拒否されました」など) が発生することがあります。最善の方法は、コンポーネントを COM+ に配置することを禁止して、インプロセス サーバーとしてのみ使用できるようにすることです。これを行う方法はありますか?
.net - COM 相互運用から AppDomain を使用できない
さまざまな理由 (信頼性、展開) のために別の AppDomain で実行する必要がある .NET コードがあります。現在の AppDomain に読み込まれないように、呼び出しを実際のものに委任する MBR から派生したプロキシ オブジェクトを作成しました。通常の CreateInstanceAndUnwrap でプロキシを作成します。
これは、.NET クライアントから使用するとうまく機能しますが、COM クライアントからロードするとキャストが失敗します。透過プロキシからのキャストに失敗します。必要なタイプが目的の AppDomain で作成され、Unwrap が成功することを検証しましたが、キャストは失敗します。興味深いことに、両方の AppDomain が同じベース ディレクトリを持っている場合に機能しますが、これはアセンブリ バインディングの失敗を示しています。しかし、Fusion のログ ビューアーには問題はありません。
こことここに似たような質問が 2 つありますが、答えはありません。何がうまくいかないのか、またはどうすればさらにデバッグできますか?
.net - ホスティング プロセスから .NET COM Interop アセンブリを切り離す
ActiveXObject が Windows デスクトップ/サイドバー ガジェットでホストされている場合、その ActiveXObject はキャッシュされ、その DLL ファイルはロックされます (つまり、移動、削除、名前の変更はできません)。問題はこれです。その後ガジェットを閉じると、DLL は Windows サイドバーによってロックされたままになり、削除できなくなります。これにより、新しいバージョンのガジェットを以前のバージョンのガジェットの上にインストールすることができず、エラー メッセージなしでガジェットの削除プロセス中に失敗するという重大な問題が発生します。
これはあまりユーザーフレンドリーではないので、ガジェットのアンロード イベント中に ActiveX コントロールとの関係を「切断」する方法を探しています。誰かがこれが可能かどうか教えてくれることを願っています。可能であれば、それを実装する方法についていくつかのアイデアを教えてください。
参考までに、Windows サイドバー ガジェットは実際には単なる Internet Explorer サーバー ウィンドウであるため、IE が同じ動作を示すと想定しても問題ありません。
編集: Unlockerは、私がする必要があることのほとんどを行っているようですが、.NET で同じことをプログラムでどのように達成できますか?
.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#でのインターフェイスの定義については説明していませんでした。
.net - 従来のASP/VBScriptページで.NetCOMオブジェクトをインスタンス化できません(エラーASP 0177)
.Net 3.5を使用して、C#でCOM相互運用機能が有効なクラスライブラリを作成しました。このオブジェクトは、従来のASPページにいくつかのユーティリティ関数を提供することを目的としています。目的のオブジェクトをインスタンス化し、そのメソッドを呼び出すtest.aspページを作成しました。私のマシンでは問題なく動作します。
別のマシン(Windows Server 2003-Standard Edition)では、アセンブリがregasmに正しく登録されていても機能しません。regeditを確認しましたが、問題ないようです。
私が得ているエラーは「ASP0177」(エラーコード)、「8000ffff; Server.CreateObject-Fehler」(エラーの説明)で、これはServer.CreateObject-Errorに変換されます。
ところで。アセンブリは署名されており、依存関係として他のカスタムビルドアセンブリはありません(システムのものだけです)。
誰かが似たようなことを経験しましたか?