既存のアプリケーションをテストするために、私たちのシミュレーションアプリケーションにロードできるDLLを作成しました。私はdllの中から既存のアプリケーションをリセットするまで、すべてうまく動作しています。 main()は再起動されますが、メモリはリセット/初期化されていないようです。 目的は既存のアプリケーションでできるだけ変更しないことです。実際には、起動時に変数を初期化するためにアプリケーションを書き直したくありません。そのほかに、すべてのローカル静的変数も古い値を保持します。管理DLLのネイティブコードを再初期化する方法
以下は、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にリセットします。
アイデア?
あなたは単にProcess :: Start()でEXEを起動して終了しませんか? –
私はアプリケーションを詳細に監視し、実行時にいくつかのグローバル変数に影響を与える必要があるためです。 – Jeroen
私はまだそれが漠然としたハッキングなしで事を再初期化できるという噂を見つける。私は "リセット"がより適切だと思う、 "初期化"は常に_initial_値を与えるプロセスです。 –