(vc ++)ocxはActiveXコントロールであり、(vc ++)dllは関数のコレクションです。vb.netアプリケーションから呼び出された場合、例外がocx内から、またはdllに含まれる関数内からスローされた場合、一部の例外のキャッチは異なる動作をする可能性があることがわかりました。
だから私の質問は:VB.netアプリケーションの観点から、.ocxファイルを使用することと.dllファイルを使用することの主な違いは何ですか?
(vc ++)ocxはActiveXコントロールであり、(vc ++)dllは関数のコレクションです。vb.netアプリケーションから呼び出された場合、例外がocx内から、またはdllに含まれる関数内からスローされた場合、一部の例外のキャッチは異なる動作をする可能性があることがわかりました。
だから私の質問は:VB.netアプリケーションの観点から、.ocxファイルを使用することと.dllファイルを使用することの主な違いは何ですか?
.ocxには、OLEオートメーションコントラクトに従うCOMコクラスが含まれています。そのコントラクトには、クライアントにエラーを返すための明確に定義された方法があります。すべてのメソッドは、メソッドが成功したかどうかを示すコードであるHRESULTを返します。これは単純な整数であり、エラーコードはWinError.hSDKヘッダーファイルで定義されています。また、IErrorInfoインターフェイスを介したエラーに関するコンテキスト情報の取得もサポートしています。CLRでのCOM相互運用機能により、障害コードが同等の例外に変換されます。
C / C++DLLのコードにはそのような標準はありません。例外がスローされた場合、ほとんどの場合、AccessViolationのような厄介なものになります。P / Invokeマーシャラーは、これらの例外がキャッチされて変換されることを確認します。「機能しなかった」以外の例外からは、常に有用な情報はほとんど得られません。これらの例外でプログラムを終了させる必要があります。プログラムから意味のある回復を行うことはできません。
DLLは共有ライブラリです。これはOSレベルのオブジェクトです。どのプロセスでもDLLをロードし、その中で定義されている関数を呼び出すことができます。
ActiveXコントロールは、ホストがメソッドを呼び出してUIに埋め込むことができる特定のインターフェイスを実装するCOMオブジェクトです。ActiveXコントロールがアプリケーションのUIに正常に埋め込まれるために実装する必要があるインターフェイスには、特定の最小要件があります。COMオブジェクトは通常、プロセスによって動的にロードされるため、DLLとして実装されます。1つのDLLが1つ以上のCOMクラスを実装する場合があります。
例外について-どのような違いが見られたかはわかりませんが、関数はプロセスのメインの.EXEファイルに実装されている関数と同じです。スローされた例外は、プログラミング言語のランタイム環境で定義されたルールに従って正常に伝播する必要があります。
ActiveXメソッドは異なります。通常、IDispatchインターフェイスと呼ばれるものを介して呼び出されます。単純なサブルーチン呼び出しではなく、IDispatchインターフェイス(IDispatch :: Invoke)でメソッドを呼び出すことによって呼び出され、引数は特定の方法でマーシャリングされます(基本的に、引数は標準型に変換され、非表示の方法でパッケージ化されます)メインプロセスの実装言語とActiveXコントロールの実装言語の呼び出し規約とデータ型の違い。)IDispatch :: Invokeインターフェイスは、ActiveXのどのメソッドにアクセスしようとしているのかを判断し、直接ルーティングします。
例外は通常、IDispatchインターフェイスを介して伝播されません。ランタイム環境がIDispatch::Invokeisによって返されるエラーコードをどのように処理するかは、実際には実装者が決定します。したがって、ActiveXコントロールでスローされたランタイムエラーや例外を処理するときに、期待に応えられないことが合理的に期待できます。
違いはありません。どちらもdllです。dllの名前を任意に変更しても、LoadLibrary、GetProcAddressを使用してロードして使用できます。
.netの世界では、dllは関数のコレクションではありません。これは、クラスとモジュールのタイプのコレクションであるアセンブリです。これらのタイプには関数も含まれている可能性がありますが、それは抽象化のレベルが異なります。
しかし、これについてocxファイルと組み合わせて話しているので、.NetはocxファイルやActiveXコントロールと直接関係がないため、vb6によって作成されたdllを参照している可能性があります。その場合、どちらもロードできるCOMオブジェクトにすぎません。