7

私の会社には、vb6 で書かれた古いプロジェクトがたくさんあります。ATL/C++ で記述された再利用可能なソフトウェア コンポーネントがいくつかあります。現在、UWP でアプリを書き直すことを検討していますが、UWP アプリは古い COM テクノロジをサポートしていないようです。UWPもサポートするCOMオブジェクトを実装する方法がないか調査中です。古いコンポーネントを UWP コンポーネントに移植すれば確実に機能することは理解しています。しかし、私たちは多くの古いソフトウェアを出荷しており、まだソフトウェア サポートを提供しているため、共通コンポーネントの 2 つのバージョンを維持したくありません。これらのソフトウェアの中には、10 年以上にわたってお客様に使用されているものもあります。出荷されたすべてのソフトウェアをアップグレードすることは不可能です。

私はいくつかの可能な解決策を考え出しました:

デスクトップ ブリッジ

Desktop Bridge を使用した UWP アプリで使用できる「Packaged COM」というフレーズを見つけました。この記事、デスクトップ ブリッジの COM サーバーと OLE ドキュメントのサポート では、UWP アプリから exe COM サーバーを呼び出す例を示します。InProcessServer にも対応していれば良さそうです。不審なInProcessServerを見つけましたが、それは WinRT コンポーネント用であることが判明しました。

また、COM 参照を UWP プロジェクトに追加しようとしました。コードは、COM オブジェクトを正常に参照できます。ただし、実行時には機能しません。UWP アプリには独自のレジストリ ハイブがあるため、システム レジストリに登録されている COM オブジェクトは読み込まれません。UWPアプリのprivate hiveに登録情報を追加し、アプリと一緒にCOM dllをパックすればうまくいくのではないかと考えています。例が見つかりませんでした。

ATL/COM

ビジネス ロジックを COM オブジェクトに実装したためです。最も実行可能な解決策は、UWP アプリケーションをサポートするように COM オブジェクトをアップグレードすることです。WinRT コンポーネントは引き続き COM テクノロジを使用しますが、新しいインターフェイスIInspectableを実装します。インターフェイスを実装する場合、古い ATL ベースの COM オブジェクトを変更して、UWP の呼び出し規約をサポートできると思いIInspectableます。私はこれを行う手がかりがありません。

WRL

MSDN の記事、How to: Create a Classic COM Component Using WRLを見つけました。これは、WRL プロジェクト テンプレートを使用して、Win32 アプリケーションと UWP アプリで使用できるクラス COM オブジェクトを実装することについて話しているものです。

それは言います:

Windows ランタイム C++ テンプレート ライブラリ (WRL) を使用すると、ユニバーサル Windows プラットフォーム (UWP) アプリに使用するだけでなく、デスクトップ アプリで使用する基本的なクラシック COM コンポーネントを作成できます。

しかし、WRL プロジェクト テンプレートが Microsoft によってサポートされなくなったことにすぐに気付きました。Web で見つけたプロジェクト テンプレートのダウンロード リンクがすべて利用できなくなりました。

C++/WinRT

この技術はWRLの後継と思われます。有望に思えますが、残念ながらまだリリースされていません。


@Peter Torrからのいくつかのことを明確にするために:

(1) アプリ/COM オブジェクトを「純粋な」UWP (すべてのデバイスで実行) にするか、デスクトップのみの fullTrust UWP (別名デスクトップ ブリッジ) でよろしいですか? (2) COM オブジェクトは、それらを出荷するアプリでのみ使用するためのものですか、それとも他のアプリで使用することになっていますか?

  1. 私の会社は Windows プラットフォームを使用して、PC ベースの産業オートメーション サービス (ハードウェアとソフトウェアの両方) を提供しています。答えはイエスです。fullTrust UWP に満足しています。当社の製品はデスクトップでのみ実行されます。新しいテクノロジを採用し、UWP の優れた UI フレームワークを活用したいだけです。

  2. COM オブジェクトは、新しいアプリ (UWP) と古いソフトウェア (一部は vb6 ベース) の両方に対応しています。COM オブジェクトが同じ (同じコード ベースから構築されている) 限り、COM オブジェクトを UWP アプリにパッケージ化し、システム登録済みの COM を古いソフトウェアに使用することに満足しています。

4

0 に答える 0