1

私は次の構成に直面しています:IEはc ++ activeX(リフレクションを使用していくつかのレガシーc ++ COM dllを使用するc#UIアプリケーション(メインアプリケーション)を開始するc#COM ActiveX(EXECUTOR)をロードするLOADERアプリケーション。

これらのレガシーc++COMの登録を回避しようとしています(マニフェストを使用したい)。しかし、成功しませんでした。

これらのdllを指す「ファイル」セクションを使用してActiveXのマニフェストを指定する方法がある場合はどうなりますか?

IEのマニフェストを作成しようとしましたが、成功しませんでした。Native.manifestをレガシーが配置されているディレクトリに配置しましたが、成功しませんでした。

ローダーとエグゼキューターの代わりにXBAPが問題を解決するはずです。しかし、現在のアーキテクチャの問題を解決する方法はありますか?

ありがとう

4

2 に答える 2

1

IE を所有していないため、IE のマニフェストを作成するべきではありません。COM 登録データをマニフェストに入れる場合は、そのマニフェストで登録データを調べるようにシステムに指示する必要があります。ホスト アプリケーションを制御しないため、これを行う方法は、アクティベーション コンテキスト APIを使用することです。特に、正しいマニフェストを指す CreateActCtx を使用し、その後にそのスレッドで ActivateActCtx を使用します。その後、必要に応じて CoCreateInstance を作成し、その後に DeactivateActCtx/ReleaseActCtx を実行できます。

XBAP が機能している理由は、それが別の実行可能ファイルであるため、マニフェストがシステムによって自動的にアクティブ化され、プロセスの開始時に XBAP プロセスに関連付けられるためです。IE 内でホストしている場合、プロセスを制御できないため、より多くの作業を行う必要があります。

于 2009-12-01T06:21:23.827 に答える
0

独自のプロセスを作成し、Web ブラウザー コントロールをホストする場合は、COM 情報を含むマニフェスト ファイルをアプリケーションに提供できます。あなたが示唆するように、各レガシー COM コンポーネントのエントリを含めることができます (progid および comClass 情報などを含む)。次に、ホストされたブラウザ コントロールにロードされた JavaScript が「new ActiveXObject()」呼び出しを実行すると、レジストリのない COM (Side-by-Side) ローダーがアクティブになり、マニフェスト ファイルを使用して必要なものを解決します。

概念実証のためだけに、15 分以内にこのソリューションに到達できます。Web ブラウザー コントロールが埋め込まれた新しい .net アプリケーションを作成し、javascript を使用してテスト html ページを記述して、レガシー コンポーネントを作成し、COM でメソッドを呼び出すだけです。コンポーネントを作成し、最後にレガシー コンポーネントのエントリを使用して exe の .manifest ファイルを作成します。Web ブラウザー コントロールのプロパティをテスト用の html ファイルに設定するだけです。COM コンポーネントの登録を解除し、exe を .manifest ファイルで更新することを忘れないでください。

FILE マニフェスト エントリの例は次のようになります。

<file name="mycom.dll">
    <typelib tlbid="<YOUR TYPELIB ID>" version="1.0" helpdir="" resourceid="0" flags="HASDISKIMAGE" />
    <comClass clsid="<YOUR COCLASS ID>" threadingModel="Apartment" tlbid="<YOUR TYPELIB ID>" progid="mycom.class.1" description="mycom.class" />
</file>

ファイル マニフェストの詳細については、次の場所を参照してください。

http://msdn.microsoft.com/en-us/library/aa375632(v=VS.85).aspx

于 2011-05-06T22:54:27.857 に答える