1

私はVB6の開発を行っていますが、これはより広い問題だと思います。VB IDEで、[BadImplementsRefInCompatLib]というエラーが発生することがあります。MattCurlandの「AdvancedVisualBasic6」に付属しているタイプライブラリビューアを使用すると、コンポーネント内のタイプライブラリに、見つからないタイプライブラリへの参照があるが、それが何であるかはないというフラグが立てられます。根本的なエラーは、TLIコンポーネントが、別のタイプライブラリで定義されているインターフェイスを見つけようとしたときに発生します。

IDLを逆コンパイルするためにOLEViewも試しましたが、誤った値を特定せずに、外部タイプを取得しようとするとエラーメッセージが表示されました。

実際のエラーを、コンポーネントを指すレジストリ内のタイプライブラリ参照までさかのぼりましたが、メジャーバージョンが正しくありませんでした。メジャーバージョンを置き換えると、問題が修正されました。

バイナリエディタを使用して、タイプライブラリで使用されている情報を特定できるかどうかを確認しました。実際、参照しているコンポーネントの名前(パスなし)は見つかりましたが、形式を理解できませんでした。私は実際に、タイプライブラリGUIDとバージョン番号のテーブルを見つけたいと思っていました。これらの名前を抽出し、「機能する」参照を削除するコードを記述できると思いますが、これは少し大雑把です。

タイプライブラリが外部タイプを参照する方法を知っている人はいますか?

4

1 に答える 1

2

[BadImplementsRefInCompatLib]は、バイナリ互換ターゲットの typelib に外部 typelib への参照があり、この外部 typelib が登録されていないことを意味します。

たとえば、バイナリ互換バージョンの互換性 Project2参照Project1(パブリック クラスの関数/プロパティ プロトタイプで Project1 の型を使用)に設定された複数の ActiveX DLL を含むプロジェクト グループがある場合、互換性が失われProject1、再コンパイルされると、Project2互換性ターゲットに typelib が含まれます。登録されていない外部タイプ ライブラリ (つまり、古いバージョンのProject1コンポーネント) を参照します。

私たちのショップでは、VB6 プロジェクト全体で参照を行っていますが、クラスのパブリック メソッド/プロパティでコアの型を使用することはありません。このようなパラメーターは、コード内で宣言As Objectおよびダウンキャストされます。これは、コンポーネントを外部相互参照で結び付けるよりも問題が少なくなります。Curland'sEditTLBは、問題のあるクラスを見つけるために定期的に使用されます。

タイプ ライブラリが外部の型を参照する方法がわかりません。私importlib("component.tlb")はidlにいて、自由にタイプを使用しcomponentています。

ところで、COM コンポーネント (DLL/OCX) が VB6 IDE で使用されないように "保護" する非常に簡単な方法はstruct、外部のカスタム メイド タイプ ライブラリ (パブリック メソッドへのパラメーター) を参照し、この外部タイプ ライブラリを出荷することを "忘れる" ことです。 . VB6 IDE は、DLL/OCX への参照を追加する際に「DLL の読み込みエラー」でチョークしますが、この「難読化された」メソッドをクロス スレッド (インプロセスかどうかにかかわらず) 呼び出そうとしない限り、コンポーネントは完全に動作し、登録されます。

于 2012-11-09T15:07:38.073 に答える