鱼C论坛

 找回密码
 立即注册
查看: 162|回复: 1

qt生成的DLL注入卡死问题

[复制链接]
发表于 2024-2-15 23:30:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
思路来源:首先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>
DWORD  WINAPI shadow_window(LPVOID lp)
{
    char** argv=NULL;
    int argc=0;
    QApplication app(argc,argv);
    QWidget w;
    QPushButton btn(&w);
    btn.setText("aaa");
    w.show();
    return  app.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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-15 23:30:34 | 显示全部楼层
从代码上看,你在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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 04:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表