COMオートメーションを介していくつかのクラスを公開するC++プロジェクトがあり、したがってIDL
ファイルがあります。
(UUID を変更せずに)のクラスに新しい関数を追加するたびに、クラスIDL
を使用する他の C++ プロジェクト (新しい関数ではない) を新しいもので再構築する必要がありIDL
ます。クラッシュしないでください。
C++ プロジェクトを再構築する必要があるのに、VB プロジェクトは問題ないのはなぜですか?
COMオートメーションを介していくつかのクラスを公開するC++プロジェクトがあり、したがってIDL
ファイルがあります。
(UUID を変更せずに)のクラスに新しい関数を追加するたびに、クラスIDL
を使用する他の C++ プロジェクト (新しい関数ではない) を新しいもので再構築する必要がありIDL
ます。クラッシュしないでください。
C++ プロジェクトを再構築する必要があるのに、VB プロジェクトは問題ないのはなぜですか?
おそらく、VB でオブジェクトを単にObject
s として定義していると思われます。たとえば、次のようになります。
Dim YourObject as Object
Set YourObject = CreateObject("YourComponent.YourObject")
その場合、VB にオートメーション インターフェイス (IDispatch) を通過させることになります。基本的に、どのタイプに割り当てるかは実行時までわからないYourObject
ため、IDispatch::Invoke を介してそのオブジェクトのメソッドを呼び出す必要があります。そのために、実行時にオブジェクト自体から呼び出しに必要なすべての情報を検索します。
対照的に、C++ コードはおそらく早期バインドされています。つまり、COM オブジェクトの vtable へのオフセットはコードに直接コンパイルされます。その場合、これらのオフセットが無効になるようにコードを変更すると、コードはひどく失敗します。