3

多くの COM コンポーネント (DLL および OCX) を含む VB6 アプリケーションを維持しています。開発と展開を合理化するために、reg-free com を使用したいと考えています。開発の問題は、アプリケーションが VB6.EXE インスタンス内で実行されることです。VB6 をだまして (未登録の) コンポーネントを使用させるにはどうすればよいですか? ブランチを切り替えるときにコンポーネントの登録/登録解除を行う必要がないことは、私にとって非常に重要です。VB6 の .manifest ファイルを生成することは問題外ではありませんが、VB6.EXE を起動するときに .manifest ファイルを指定するための、より最適な方法はありますか?

注: アクティベーション コンテキスト API は、開発環境内から使用しても役に立たないようです。

私が考えた解決策:

  • マニフェストからコンテキストをアクティブ化し、VB6 を子プロセスとして起動するユーティリティ アプリケーション (動作しません。プロセスはアクティブ化コンテキストを継承しません)
  • 起動時にコンテキスト アクティベーションを VB6 プロセスに挿入する (複雑すぎる; これを行うには、実行可能ファイルをハックする必要があります)
  • 適切なコンテキストをアクティブ化した後、自分のプロセスで VB6 をホストする (これが可能かどうかさえわかりません)
  • VB6アドインまたはVB6内で実行されるその他のユーティリティを使用してコンテキストをアクティブ化します(試してみましたが、うまくいかないようです)

1月16日更新

wqwで提案されているように、VB.exe.manifestでいくつかのテストを行いました。VB6.exe.manifest は機能しましたが、いくつかの注意事項があります。

  • マニフェストで指定された SxS dll は、実際にはコンポーネントを参照していないプロジェクトの参照ウィンドウに表示されませんでした。
  • コンポーネントを参照したプロジェクトでは、次の順序に従ってディレクトリに存在することが示されます。

    1. プロジェクト ファイルに記録されたパス名 (ファイルがまだ存在する場合)
    2. プロジェクトと同じフォルダーに存在するかのようなパス名 (vbp)

    ファイルがこれらのフォルダーのいずれにもない場合、プロジェクトはコンパイルされず (コードを実行するだけで VB6 で内部コンパイルが発生します)、「プロジェクトまたはライブラリが見つかりません」というメッセージが表示されます。

当然のことながら、VB6 は実際にレジストリをスキャンして COM コンポーネントを見つけ、コンパイル中に存在することを確認します。実際にVB6.exe.manifestを使用してCOMコンポーネントのインスタンス化をリダイレクトしたい場合、それが何を意味するのかわかりません。おそらく、定義済みの場所にダミーのコンポーネント ファイルがあると、まったく異なるコンポーネント セットがロードされて使用されるにもかかわらず、VB6 はすべてが正常であると信じ込ませる可能性があります。

さらに更新:

最後の仮定についてテストを行ったところ、それは誤りであることが判明しました。プロジェクトをコンパイルするには、コンポーネントが実際に存在する必要があります。適切にロードする必要があります (ダミーのゼロ長ファイルは受け入れられません!)。マニフェストが機能するかどうかさえわかりません。これは、より時間のかかるテストです (1 つはプロジェクト用、もう 1 つはマニフェスト用の、異なる結果を生成する 2 つのバージョンを持つコンポーネントが必要です)。

4

1 に答える 1