0

ネイティブ拡張 (air Updater クラスではサポートされていないネイティブ署名済みインストーラー) を使用する AIR デスクトップ アプリケーションの自動サイレント アップデートを作成する必要があります。完全に機能するアプリケーションを起動し、

taskkill /IM Project.exe
taskkill /IM adl.exe
wmic product where name="Project" call uninstall /nointeractive
"%HOMEPATH%\AppData\Roaming\com.Project\Local Store\Project.exe" -silent -eulaAccepted -location "\"%PROGRAMFILES(X86)%\" -desktopShortcut
"%PROGRAMFILES(X86)%\Project\Project.exe"
taskkill /IM cmd.exe 

私はそれを実行する Java プログラムを作成しましたが、それも正常に動作し、予想よりもさらに優れています。cmd も表示されず、完全にサイレントです。

try {
        String ls_str;

        Process ls_proc = Runtime.getRuntime().exec("Bat/update.bat");

        // get its output (your input) stream

        DataInputStream ls_in = new DataInputStream(
                                          ls_proc.getInputStream());

        try {
        while ((ls_str = ls_in.readLine()) != null) {
            System.out.println(ls_str);
        }
        } catch (IOException e) {
        System.exit(0);
        }
    } catch (IOException e1) {
        System.err.println(e1);
        System.exit(1);
    }

しかし、この Java ソリューションを実際に実装することはできません。AIR はそれをサポートしていません。

だから私は.batファイルを起動するネイティブ拡張機能を作りました, それは動作します,

system("cmd /C \"%HOMEPATH%\\AppData\\Roaming\\com.Project\\Local Store\\update.bat\"");

しかし、この方法には 2 つの問題があります。

  • CMD は開いたままです。
  • ソフトウェアの最後のバージョンはバックグラウンドでフリーズしたままなので、bat ファイルはそれを閉じていません...

ソフトウェアの新しくインストールされたバージョンを閉じるとすぐに、これらすべてが消えます...

では、Java プログラムを改善し、実装する方法を見つける必要がありますか? または、ネイティブ拡張機能を使用するより良い方法はありますか?

誰でもこれで私を助けることができますか? 前もって感謝します


編集

今のところ、バッチ ファイルを実行する単純な vbs ファイルを使用しています。

CreateObject("Wscript.Shell").Run "update.bat",0,True

ネイティブ拡張を介してvbsを起動します。これは静かな良い結果ですが、実行中に非表示にしたい空のcmdがあります...かなり疲れる回避策です...

しばらくはこれで作業できますが、本当に改善したい..

4

1 に答える 1

0

凍結のための迅速で汚い解決策は、次のものを置き換えることです:

system("cmd /C \"%HOMEPATH%\\AppData\\Roaming\\com.Project\\Local Store\\update.bat\"");

と:

system("start cmd /C \"%HOMEPATH%\\AppData\\Roaming\\com.Project\\Local Store\\update.bat\"");

編集

ShellExecute両方の問題を解決するには、バッチ ファイルを使用せずに、ネイティブ API 関数を使用してネイティブ アプリケーションから直接バッチ ファイルにあるコマンドを実行します。

以下は、ネイティブ C アプリケーションに配置する必要があり、バッチ ファイルが現在実行していることを実行する必要があります (調整が必要になる場合があります)。windows.hアプリケーションにヘッダーを含める必要があります ( #include <windows.h>)。

    ShellExecute( NULL, "open", "taskkill.exe", "/IM Project.exe", NULL, SW_HIDE );
    ShellExecute( NULL, "open", "taskkill.exe", "/IM adl.exe", NULL, SW_HIDE );
    ShellExecute( NULL, "open", "wmic.exe", 
        "product where name=\"Project\" call uninstall /nointeractive", 
        NULL, SW_HIDE );
    ShellExecute( NULL, "open", 
        "%HOMEPATH%\\AppData\\Roaming\\com.Project\\Local Store\\Project.exe", 
        "-silent -eulaAccepted -location \"%PROGRAMFILES(X86)%\" -desktopShortcut",  
        NULL, SW_HIDE );
    ShellExecute( NULL, "open", 
        "%PROGRAMFILES(X86)%\\Project\\Project.exe", NULL, NULL, SW_HIDE );

注: 簡単にするために、エラー管理コードは含めませんでした。堅牢なアプリケーションが必要な場合は、からの戻り値をチェックしてShellExecuteエラーを検出し、それに応じて対処する必要があります。ShellExecuteドキュメントを参照してください。

于 2013-09-28T12:08:42.070 に答える