关于DLL中新建一线程并RUN TAPPLICATION类的问题

morphia 2008-12-17 11:38:09
因为一些特殊需要,我要使用远程注入的方式将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这个类在建立时做了哪些事情,而为什么无法正常的退出.
碰到这个问题已经两天,查了好多资料都未果,还有劳各位大大为我排忧解难.

...全文
85 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
nj_ywx 2009-02-11
  • 打赏
  • 举报
回复
顶一个先!
morphia 2008-12-20
  • 打赏
  • 举报
回复
Waiting4you的办法不行,还是出错,
但是我现在在DLL_PROCESS_DETACH的时候,使用EXITTHREAD(0),把主进程强制关闭了,就没有出错提示了,虽然粗鲁点.
谢谢各位,结帖!
jaffy 2008-12-19
  • 打赏
  • 举报
回复
恩,可以试试楼上的方法
Waiting4you 2008-12-19
  • 打赏
  • 举报
回复
可以试试让TTestCallMainForm的Owner为宿主主窗口. 就是在TTestCallMainForm::CreateParams里改写WndParent为宿主主窗口,这样宿主主窗口关闭里TTestCallMainForm也会跟着关闭,Application也就感知到了.
morphia 2008-12-19
  • 打赏
  • 举报
回复
谢谢WAITING4YOU,我这两天就试试
jiang_jiajia10 2008-12-18
  • 打赏
  • 举报
回复
UP
laowang2 2008-12-18
  • 打赏
  • 举报
回复
对,应该传Application进来。
int  WINAPI  DllEntryPoint(HINSTANCE  hinst,  unsigned  long  reason,  void*  lpReserved)  
{
if (reason == DLL_PROCESS_ATTACH)
DllApplication = Application;
if (reason == DLL_PROCESS_DETACH)
Application = DllApplication;
return 1;
}

jaffy 2008-12-18
  • 打赏
  • 举报
回复
在含MDI的DLL中,若不进行如下处理,肯定出错,原因就是DLL也有Application之故!

TApplication *DllApplication = NULL;

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
if (reason == DLL_PROCESS_ATTACH)
DllApplication = Application;
if (reason == DLL_PROCESS_DETACH)
Application = DllApplication;
return 1;
}


另外试试
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
CoInitialize(NULL);
break;
case DLL_PROCESS_DETACH:
CoUninitialize(NULL);//你要看看BCB,我不知道有没有记错
break;
}

ooily 2008-12-18
  • 打赏
  • 举报
回复
不懂,帮顶
morphia 2008-12-18
  • 打赏
  • 举报
回复
谢谢楼上两位

因为宿主程序不一定是DELPHI或者BCB的程序,所以,宿主程序的APPLICATION是传不到我的DLL来的,CoInitialize()和CoUninitialize()也加上了,在宿主程序退出的时候,我的DLL还是一样出错.我想原因应该是DLL的APPLICATION没有得到退出通知,然后DLL中的窗口就被主线程粗鲁的结束了,但是因为APPLICATION还是在活动中,于是继续进行消息循环,于是就取到了一个"无效的窗口句柄",问题就在于,如何可以在宿主程序退出并且关系窗口之前我得到通知呢?

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧