COM 登録を行うために、heat を使用して COM dll ファイルと tlb ファイル (VB.NET で開発された MyLib.* と呼びましょう) を収集しています。MyLib.dll と MyLib.tlb をアプリケーションのインストール フォルダ (INSTALLDIR) にインストールすると、すべてが正常に機能していました。ただし、異なるバージョンの SW を同じマシンにインストールできるようにしたいので、それらが同じバージョンの COM コンポーネントを使用している場合、dll のコピーは 1 つだけです (SW の各バージョンには独自のバージョンが必要だと思います)。 tlb、間違っていたら訂正してください) をインストールする必要があるため、MyLib.dll を別のフォルダー、具体的には PROGRAM_FILES\Common Files\SHARED_FOLDER_NAME にインストールしたいので、SW の 1 つのバージョンがアンインストールされると、MyLib.dll は削除されず、他のバージョンで引き続き使用できます。
しかし、ここで問題が発生します。このdllをこの別のフォルダーにインストールした後、COM登録が機能しなくなり、登録の失敗を示すCOM関数を呼び出しているときに指定されたファイルが見つからないと言い続けます。WIX インストーラー プロジェクトでは、MyLib.dll のこのフォルダー以外はすべて同じです。
インストール後のレジストリ構造は次のとおりです。
まず、HKCR\CLSID{MYCLSIDs} があり、それぞれが私の COM クラスの 1 つを表しています。「InprocServer32」という名前のサブキーには、Assembly、Class、CodeBase、RuntimeVersion、threadingModel があります。CodeBase は、共通ファイル フォルダー (動作していない) または MyApp のインストール フォルダー (動作中) のいずれかであり、これは dll を配置したさまざまな場所です。Access は TypeLib しか認識せず、TypeLib から実際の dll へのリンクがあるはずなので、{MYCLSIDs} の下に別のサブキー TypeLib があると思いましたが、どちらの場合も、このサブキーはありませんが、 2番目のケースはまだ機能しています。問題はありますか?
次に、HKLM\Software\Classes\CLSID{MYCLSIDs} があります。これらのキーは、もちろん上記と同じ構造です。
3 番目に、HKCR{MYPROGIDs}、これらは私のクラスの単なる ProgID です
4 番目に、tlb ファイルからの情報を含む HKCR\Typelib{LibID} で、この ID は COM コンポーネント プロジェクトのアセンブリ GUID から取得されます。
最後に、HKEY_CLASSES_ROOT\Interface{InterfaceID} には、値 {00020424-0000-0000-C000-000000000046} を持つ ProxyStubClsid32 という名前のサブキーがあり、TypeLib という名前のサブキーと値は私の LibID です。
前述したように、唯一の違いは、MyLib.dll の場所を格納する CodeBase です。それを確認するために、2 つのテストを行いました。MyLib.dll を共有フォルダーにインストールした後、COM の呼び出しに失敗しました。しかし、SHARED_FOLDER\MyLib.dll のすべての CodeBase 値を INSTALLDIR\MyLib.dll に置き換え、MyLib.dll を INSTALLDIR にコピーすると、実際に機能します。逆に、MyLib.dll を INSTALLDIR にインストールした後 (この場合、COM は動作しています)、CodeBase の値を INSTALLDIR\MyLib.dll から SHARED_FOLDER\MyLib.dll に変更し、SHARED_FOLDER にコピーを作成しますが、今回は失敗します。ということで、私のCOM理解とは逆に、まさに設置場所の問題のようです。また、インストーラーが作成するフォルダーにあるため、SHARED_FOLDER (間違っている可能性があります) のアクセス許可の問題はないと思います。
助けてください、ありがとう!