关于DLL中新建一线程并RUN TAPPLICATION类的问题
因为一些特殊需要,我要使用远程注入的方式将DLL注入至一未知进程中,并且,我在DLL收到DLL_PROCESS_ATTACH通知的时候启动一新线程.
在该线程中,我将会按照标准APP的方式RUN一个TApplication并且建立若干的FORM,具体的代码如下:
void __fastcall TMyThread::Execute()
{
try {
Application->Initialize();
Application->ShowMainForm = true;
Application->CreateForm(__classid(TTestCallMainForm),
&TestCallMainForm);
Application->CreateForm(__classid(TParamForm), ¶mForm);
Application->Run();
} catch (...) {
}
FreeLibraryAndExitThread(m_hDllModule, 0);
}
该DLL在注入后运行良好,并且在建立的线程中选择窗口中的退出功能,也可以顺利的把DLL从进程中卸载出去.
但是我还是遇到了一个问题却没有办法搞定,就是:当宿主进程退出时,我的TApplication类却好像似接收不到退出的通知
出现了"无效句柄"的错误.
我在DLLMAIN函数中可以收到DLL_PROCESS_DETACH通知,但是当接收到通知的时候我下断点,发现DLL建立的线程已经退出了,而
在这个时候我调用Application->Terminate(); 是没有任何效果,而且使用WaitForSingleObject()等待线程也是直接返回
早些时候,我用VC++也做了一个同样的程序进行测试,没有用到MFC,只是纯WIN32 API搭起来的窗口,当宿主程序退出的时候,DLL
的线程也正常关闭退出(至少是没有看到任何的异常被抛出,并且也没有错误提示窗口)
我想应该是和TApplication这个类有关系,不知道TApplication这个类在建立时做了哪些事情,而为什么无法正常的退出.
碰到这个问题已经两天,查了好多资料都未果,还有劳各位大大为我排忧解难.