これは理想的ではないことはわかっていますが、私の制約は、Clipperで作成されたレガシーアプリケーションがあることです。
アプリケーション内から新しいWinForms/WPFアプリケーションを起動したい(移行を容易にするため)。Clipperで記述されたこのレガシーアプリケーションは、以下を使用して起動します。
SwpRunCmd("C:\MyApp\MyBat.bat",0)
バッチファイルには、次のようなコマンドが含まれています。
C:\PROGRA~1\INTERN~1\iexplore "http://QASVR/MyApp/AppWin/MyCompany.MyApp.AppWin.application#MyCompany.MyApp.AppWin.application"
ClickOnceを介して展開するWinForms/WPFアプリを起動しています。WPFをアプリケーションに導入するまで、すべてが順調に進んでいます。レガシーアプリケーションから簡単に起動できました。
ただし、WPFを導入したため、次のように動作します。最初にClipperアプリケーションを介して起動すると、アプリケーションの起動時に例外が発生します。エラーテキストは次のとおりです。
The type initializer for 'System.Windows.FrameworkElement' threw an exception.
at System.Windows.FrameworkElement..ctor()
at System.Windows.Controls.Panel..ctor()
at System.Windows.Controls.DockPanel..ctor()
at System.Windows.Forms.Integration.AvalonAdapter..ctor(ElementHost hostControl)
at System.Windows.Forms.Integration.ElementHost..ctor()
at MyCompany.MyApp.AppWin.Main.InitializeComponent()
at MyCompany.MyApp.AppWin.Main..ctor(String[] args)
at MyCompany.MyApp.AppWin.Program.Main(String[] args)
The type initializer for 'System.Windows.Documents.TextElement' threw an exception.
at System.Windows.FrameworkElement..cctor()
The type initializer for 'System.Windows.Media.FontFamily' threw an exception.
at System.Windows.Media.FontFamily..ctor(String familyName)
at System.Windows.SystemFonts.get_MessageFontFamily()
at System.Windows.Documents.TextElement..cctor()
The type initializer for 'MS.Internal.FontCache.Util' threw an exception.
at MS.Internal.FontCache.Util.get_WindowsFontsUriObject()
at System.Windows.Media.FontFamily.PreCreateDefaultFamilyCollection()
at System.Windows.Media.FontFamily..cctor()
Invalid URI: The format of the URI could not be determined.
at System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind)
at System.Uri..ctor(String uriString, UriKind uriKind)
at MS.Internal.FontCache.Util..cctor()
最初にURL(IEの場合)またはデスクトップのアイコンを介してアプリケーションを起動した場合、例外は発生せず、アプリケーションは期待どおりに起動します。
素晴らしいのは、最初に起動するものが何であれ、アプリがまったく起動するかどうかを決定することです。したがって、最初にレガシーで起動すると、すぐに壊れて、他の方法で成功したURLまたはアイコンで起動してもアプリを実行できません。それを機能させるには、ログアウトして再度ログインし、URLまたはアイコンから開始する必要があります。
最初にURLまたはアイコンを使用する場合、その時点から(ログアウトして再度ログインするまで)レガシーアプリケーションから問題なく起動できます。
もう1つの情報は、次の方法で問題をシミュレートできることです。「cmd.exe」を使用してコマンドプロンプトを入力し、ステートメントを実行してURLから起動すると、成功します。ただし、「command.com」を使用してコマンドプロンプトを入力し、同じステートメントを実行すると、動作が中断されます。
これは、Clipperのレガシーアプリケーションがcommand.comと同等のものを使用して、他のアプリを生成するためのシェルを作成するためであると想定しています。command.comにcmd.exeまたはpsexecを実行させてから実行するなど、さまざまなハックを試しましたが、何も機能していないようです。
回避策についていくつかのアイデアがあります(たとえば、起動時にアプリを起動して、URLからの起動を強制し、その後のすべての起動を成功させるなど)が、ワークステーションを大幅に制御しているにもかかわらず、それらはすべて最適ではありません。
これが権限に関連する可能性を減らすために、起動アカウントに管理者権限(および違いが生じた場合は非管理者権限)を付与しました。
どんなアイデアでも大歓迎です。私が言ったように、いくつかの回避策がありますが、私はそれらを避けたいと思います。
ありがとう!