1

私が (C で) 開発しているアプリケーションでは、メイン アプリケーションを実行する前に、最初にローダー アプリを実行する必要があります。このタスクを自動化するために、メインアプリが起動時にローダーアプリを子として実行するようにしました。これはすべて正常に機能しますが、メイン アプリが正しく機能するためには、ユーザーの現在のログイン セッション中にローダー アプリを 1 回だけ実行する必要があり、メイン アプリが実行されるたびにローダー アプリを実行する必要があることは事実です。痛み。だから私が求めているのは、WindowsまたはCの機能を使用してローダーがすでに実行されているかどうかを確認する方法はありますか? 理想的には、このようなものが素晴らしいでしょうが、それが可能かどうかはわかりません:

if(thisapp.exe hasBeenExecuted)
    return;
else
    spawnl(app_path, app_name, args, NULL);

または、ローダーの実行時にフラグとして機能するダミー ファイルをメイン アプリに作成させるようなものかもしれません。その後の実行では、ファイルが存在するかどうかを確認し、存在しない場合はローダーを実行します。これに関する唯一の問題は、コンピューターの電源を切るとダミー ファイルが消去されるように自動化することです (これを行う方法はありますか?)。

いくつかの明確化: ローダー アプリを編集したり、メイン アプリでその機能を複製したりすることはできません。私はそれを作成していません。

助けてくれてありがとう

4

5 に答える 5

2

これを行うにはいくつかの方法があります。

アプリケーションはRun キーにエントリを追加できます。これにより、ユーザーがログオンしたときに、セッションごとに少なくとも 1 回実行されることが保証されます。この場合、再起動と区別するために特別なコマンドライン引数を渡すことができます。

もう 1 つのオプションは、状態を現在のユーザー ハイブに格納し、REG_OPTION_VOLATILEフラグを使用してキーを作成することです。これにより、キーはメモリにのみ格納され、ユーザーがログオフするときにハイブがアンロードされるときにディスクにフラッシュされません。

于 2010-03-01T21:56:52.313 に答える
1

膨大なファイルを読み書きすることなく、アトム関数を使用することもできます

http://msdn.microsoft.com/en-us/library/ms649053%28VS.85%29.aspx

于 2010-03-01T22:00:00.487 に答える
0

過去に使用された 1 つの提案は、ロード時にユーザー ハイブ (つまり、レジストリ) からアプリケーションを実行して、ファイルを削除 (または作成) することです。利点は、起動時 (フックする場所に応じてユーザー プロファイルの読み込み時) に実行されるシェル スクリプト (バッチ ファイル) と同じくらい単純であり、ほとんどの場合 (起動時またはユーザー ログイン時のいずれかで) 1 回実行する必要があることです。 )。ログインを選択した場合、ログアウト後にユーザーがマシンにログインするたびに実行できます。

ユーザーのログアウト時に行うこともできますが、ハイブがアンロードされたときのマシンの状態を常に知っているとは限らないため、これは信頼性がやや低くなります (クラッシュしたり、電源が切れたりする可能性があります)。

それを行う完全な証明方法ではなく、Windows でのみ機能しますが、ほとんどの通常の使用シナリオでは機能します。

別のトリックとして、タイムスタンプをファイルに書き込み、ロード時にタイムスタンプを取得して、現在のユーザーがログオンしている時間よりも短いかどうかを確認できます。その場合は、現在のユーザー セッション中に発生した可能性が最も高いため、ロードをスキップできます。

繰り返しになりますが、これにはいくつかの欠点がありますが、適度にうまく機能するはずです。

于 2010-03-01T21:59:19.500 に答える
0

過去にミューテックスを使用してこれを実装しました。

例えば:

int main( int argc, char argv[][] )  
{
    // if Mutex exists
    // {
    //     Don't allow a second instance to run:
    //     Notify user, log something, etc.
    //     return 0;
    // }
    // else
    // {
    //     Create Mutex, this is the first time running
    // }

    // Rest of your program runs from here . . .
}

-億

于 2010-03-01T22:19:45.243 に答える
0

ローダー アプリは何をしますか?つまり、最初に実行する必要がありますか?

それがあなたが本当に気にかけていることなので、正しい答えはそれが行われたかどうかを確認して確認することだと私には思えます。それ以外のものは壊れやすく、まれに壊れる可能性があります。

于 2010-03-01T22:04:45.553 に答える