为了测试现有的应用程序,我编写了一个可以加载到我们的模拟应用程序中的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中重置时,main重新启动,但测试变量保持值1.显然,当我重置应用程序时,我希望将此变量重置为0.
有什么想法吗?
答案 0 :(得分:1)
如果本机DLL没有提供重置其状态的函数,那么您将必须卸载DLL然后重新加载它。如果您使用的隐式链接是不可能的。您必须使用显式链接:LoadLibrary,GetProcAddress等。
我假设本机代码包含在一个单独的DLL中。如果情况并非如此,那么你就完全陷入了困境。
答案 1 :(得分:0)
非常简单。
static char test;
test = 0;