qt生成的DLL注入卡死问题
思路来源:首先MFC可以创建一个dll文件,可以在里面创建一个界面,在dll注入到一个程序的时候可以弹出来一个窗口。提出想法:我想这qt能不能做到同样的事情?
实现方式:代码如下,简单来说就是在dllmain里面调用CreateThread创建新线程,然后再新线程里实现QApplication 消息循环,选CreateThread是因为这个函数即使主线程结束了,子线程也不会结束,而且qthread和cpp提供的线程使用的类似java或者py的setdeamon或者wait这种函数会卡死线程。
遇到问题:使用dll注入工具注入到同样是qt写的界面程序中,界面是弹出来了,拖动界面没问题,但不能碰上面的按钮,一碰一会就卡死了。百思不得其解,求大大指点一下,万分感激。我寻思再被注入程序的进程里有俩线程,应该互相不会影响,也不知道哪里出了问题。
#include<QApplication>
#include<QPushButton>
#include <windows.h>
#include<ui_test.h>
DWORDWINAPI shadow_window(LPVOID lp)
{
char** argv=NULL;
int argc=0;
QApplication app(argc,argv);
QWidget w;
QPushButton btn(&w);
btn.setText("aaa");
w.show();
returnapp.exec();
}
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD callreason, LPVOID lp)
{
if(callreason==DLL_PROCESS_ATTACH)
{
MessageBoxA(NULL,"sxaa","bbb",MB_OK);
CreateThread(NULL,0,LPTHREAD_START_ROUTINE(shadow_window),0,0,NULL);
}
return TRUE;
}
从代码上看,你在DLL的入口函数DllMain中创建了一个新的线程,并在该线程中初始化了一个QApplication,并创建了一个窗口和一个按钮。然而,你可能遇到了一个常见的问题:Qt在多线程环境中使用时需要遵循一些特定的规则。
首先,Qt应用程序只能在主线程中创建和运行。在其他线程中创建Qt窗口和进行Qt GUI相关操作通常会导致未定义的行为。因此,你应该将QApplication和界面相关的代码放在主线程中执行。
其次,由于DLL是在其他进程中注入的,而不是主进程,可能会涉及到进程间通信的问题。如果你希望在目标程序的主线程中创建Qt窗口,你需要与目标程序进行进程间通信,以便在主线程中执行Qt相关代码。这种通信可以通过共享内存、消息队列或自定义的IPC机制来实现。
总结一下,你的思路基本是正确的,但需要注意以下几点:
1. 在DLL中创建Qt应用程序和窗口会导致问题,因为Qt应用程序应该在主线程中运行。
2. 在目标程序的主线程中创建Qt窗口需要进行进程间通信。
你可以考虑使用其他方法来实现你的需求,比如使用Qt的信号与槽机制来发送消息进行通信,或者使用Qt的远程对象框架进行跨进程通信。这样可以避免直接在DLL中创建Qt应用程序和窗口导致的问题。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]