2

これは理想的ではないことはわかっていますが、私の制約は、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からの起動を強制し、その後のすべての起動を成功させるなど)が、ワークステーションを大幅に制御しているにもかかわらず、それらはすべて最適ではありません。

これが権限に関連する可能性を減らすために、起動アカウントに管理者権限(および違いが生じた場合は非管理者権限)を付与しました。

どんなアイデアでも大歓迎です。私が言ったように、いくつかの回避策がありますが、私はそれらを避けたいと思います。

ありがとう!

4

3 に答える 3

1

この方法でアプリを起動すると、Presentation Font Cache サービスの起動に問題があるようです。クライアント環境を制御できる場合は、Windows プレゼンテーション フォント キャッシュの起動を手動ではなく自動に設定してみてください。

于 2010-04-09T09:03:08.293 に答える
0

これは、不完全な情報で作成された暗所でのショットです。

command.com と cmd.exe はかなり異なります。私の知る限り、command.com は従来の互換性のために存在するため、そこから実行するアプリケーションは異なる方法で実行されます。command.com は 16 ビット モードで動作し、(私が実行している) Windows の 64 ビット バージョンはそのモードをサポートしていないと考えているため、投稿を完了するために何もテストできません。自分。

そうは言っても、32 ビット アプリケーション (マネージド アプリケーションを含む) を実行しようとしても違いはありません。

お使いの環境の制限についてはわかりませんが、次のことをお試しください。

  • あなたの名前をに変更.batして、ではなく.cmdで始まるようにしますcmd.execommand.com
  • コンソール コマンド.batを使用してプログラムを起動します。start
  • 非 WPF プログラムを使用して、より健全な環境で WPF プログラムを呼び出す
于 2010-04-06T22:10:34.887 に答える
0

The problem is that the windir environmental variable is not set when using command.com.

So, in your case, adding the line set windir=C:\Windows to the beginning of the bat file will solve the problem (assuming that you have your Windows instalation in C:\Windows.

An additional issue might be that the host application is running command.com in compatibility mode. The best is to list all the environmental variables after running cmd.exe (using the set command) and comparing it to the output of the set command that you set in your bat file

于 2010-11-08T10:30:30.620 に答える