0

既存のアプリケーションをテストするために、シミュレーションアプリケーションにロードできるdllを作成しました。dll内から既存のアプリケーションをリセットするまで、すべてが正常に機能しています。main()を再起動しましたが、メモリがリセット/初期化されていないようです。目標は既存のアプリケーションの変更をできるだけ少なくすることなので、実際には、起動時に変数を初期化するようにアプリケーションを書き直したくありません。それ以外に、すべてのローカル静的変数も古い値を保持します。

dll内から既存のアプリケーションを呼び出す方法のサンプルを以下に示します。

void TimerThread::Run(void)
{
  while(true)
  {
    if ((nullptr != mpMainThread) && (mpMainThread->ThreadState == System::Threading::ThreadState::Stopped))
    {
      // Cleanup MainThread when thread has stopped
      delete mpMainThread;
      mpMainThread = nullptr;
    }

    if (nullptr == mpMainThread)
    {
      // (Re)create MainThread in which the existing application is executed
      mpMainThread = gcnew System::Threading::Thread(gcnew System::Threading::ThreadStart(&Main));
      mpMainThread->Priority = System::Threading::ThreadPriority::Highest;
      mpMainThread->Start();
    }
    dtStartTime = System::DateTime::Now;           // Keep track when started.
    if (nullptr != mpMainThread)
    {
      //Simulate timertick in existing application
      main_callback_timer_elapsed();
    }

    dtEndTime = System::DateTime::Now;
    iDuration = dtEndTime->Millisecond - dtStartTime->Millisecond;  // Determine execution time.
    System::Threading::Thread::Sleep(((TIMER_INTERVAL - iDuration) > 0) ? (miInterval - iDuration) : 0);    // Set sleep time depending on time spent
  }
}

void TimerThread::Main(void)
{
  main();     // Run main off existing application
}

void TimerThread::Reset(void)
{
  mpMainThread->Abort();      // Reset existing application by aborting MainThread
}

既存のアプリケーションのメインは非常に一般的です。main()の表示の下。

int main(void)
{
  static char test = 0;

  init_stuff();

  while(true)
  {
    test = 1;

    do_stuff();
    while(!timer_tick)
    {
      check_timer();
    }
    timer_tick = FALSE;
  }
}

静的テスト変数は0で初期化され、無限ループで1に設定されます。アプリケーションがdll内からリセットされると、メインは再起動しますが、テスト変数は値1を保持します。明らかに、アプリケーションをリセットするときにこの変数を0にリセットする必要があります。

何か案は?

4

2 に答える 2

1

ネイティブDLLに状態をリセットする機能がない場合は、DLLをアンロードしてからリロードする必要があります。暗黙のリンクを使用している場合、それは不可能です。LoadLibrary、GetProcAddressなどの明示的なリンクを使用する必要があります。

ネイティブコードは別のDLLに含まれていると思います。そうでない場合は、完全に立ち往生しています。

于 2012-04-05T07:06:29.447 に答える
0

ものすごく単純。

static char test;
test = 0;
于 2012-04-05T06:35:16.280 に答える